部分视图中不同型号类型的问题

5
我有一个页面(razor),其中包含5个不同的部分视图。每个部分视图负责一些来自数据库的数据。在该主页面中,我使用了一个模型对象,但是对于部分视图,我使用不同的模型对象。问题是,在部分视图中设置模型对象时,我的应用程序会出现以下错误: 向字典传递的模型项的类型为 'MyProject.WebUI.Models.BigPageViewModel',但此字典需要一个类型为 'MyProject.WebUI.Models.StatisticsViewModel' 的模型项。
以下是代码: 这是包含部分视图的大页面:
@model MyProject.WebUI.Models.BigPageViewModel
@{
    Layout = "../Shared/_BigPage.cshtml";
}
...
@{Html.RenderPartial("../Data/StatisticsFeed");}
...

这是控制器代码。对于这个方法,我创建了一个部分视图,应该在大页面中呈现。
public ActionResult StatisticsFeed()
        {
            StatisticsViewModel cs = new StatisticsViewModel();
            cs.TotalData = (new StatisticsRepository()).GetStatisticCompleteData(1);
            return View(cs);
        }

以下是Partial View中的代码:

@model MyProject.WebUI.Models.StatisticsViewModel
...

我使用了'RenderAction'方法而不是'RenderPartial'方法,它返回了值但是给我返回了两个结果,一个有数据,一个没有,这一定是某个愚蠢的错误...

public ActionResult StatisticsFeed()
        {
          StatisticsViewModel cs = new StatisticsViewModel();
                cs.TotalData = (new StatisticsRepository()).GetStatisticCompleteData(1);

            cs.TotalCitizns = 569;
            return View(cs);
        }
1个回答

8

在使用RenderPartial方法时,需要明确指定第二个参数传递的模型。如果不指定,则会传递父级模型,导致出现异常:

@{Html.RenderPartial("../Data/StatisticsFeed", Model.SomePropertyOfTypeStatisticsViewModel);}

另一种可能是使用RenderAction
@{Html.RenderAction("StatisticsFeed", "ControllerName");}

这将调用StatisticsFeed控制器操作,该操作将从数据库中获取模型并呈现结果。

2
@1110,没错。好的,你需要将 StatisticsViewModel 的一个实例传递给你的部分视图,因为这是它所期望的。你存储它的位置是另一个问题。它确实可以是你主视图模型的属性。你也可以传递一个新的实例:new StatisticsViewModel() - Darin Dimitrov
如果我传递一个新对象,那么该对象是空的。在我的问题的第二段代码中,我填充了包含该部分视图数据的对象。当我在'bigPage'模型中有统计对象时,我的问题得到了解决。所以,我是否有办法直接从控制器注入到我的部分视图中?因为我担心我的'bigPageViewModel'会太大。 - 1110
@1110,你可以使用RenderAction而不是RenderPartial来实现,像这样:@{Html.RenderAction("StatisticsFeed", "ControllerName");}。这将经过控制器动作并呈现部分视图。我也更新了我的答案,包括一个示例。 - Darin Dimitrov
@1110,你的主视图是什么样子的?你是如何渲染这两个操作的?另外,你可能想从你的“StatisticsFeed”操作中返回return PartialView(cs); - Darin Dimitrov
抱歉,我犯了一个愚蠢的错误,我没有删除旧代码,所以出现了双重视图。非常感谢你,你真的救了我的命 :) - 1110
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接