我想渲染一个局部视图,其中包含从rss Feed收到的新闻列表。 我有以下控制器:
RssFeedPartial
public ActionResult HealthCareNews()
{
// get the news add them to a list.
return PartialView("_HealthCareNews",rssList);
}
我想在About,News等页面中呈现这个局部视图。
家庭控制器
public ActionResult About()
{
return View();
}
关于页面
<div id="rightColumn">
@Html.Partial("_HealthCareNews")
</div>
_HealthCareNews page
@model IEnumerable<MDISS.ViewModel.RSS>
@foreach(var item in Model)
{
//display list
}
当我尝试打开关于页面时,出现以下错误:
对象引用未设置为对象的实例。
答案 0 :(得分:3)
@Html.Partial("_HealthCareNews")
直接呈现您的局部视图。由于您未向其传递任何数据,因此Model
属性将为null
。这会导致Object reference not set to an instance of an object
错误。
相反,您想要在控制器上调用HealthCareNews
操作。您可以使用Html.Action这样执行此操作:
@Html.Action("HealthCareNews")
直接从视图传递数据或部分视图仅包含静态数据时,可以使用直接渲染部分视图(使用Html.Partial
)。
当您的局部视图依赖于不属于您渲染视图模型一部分的数据时,您可以使用Html.Action
。这样,您就可以在控制器上执行action方法。 action方法可以构建部分视图所需的模型。
MVC中的操作方法返回ActionResult
。 ActionResult
是MVC中存在的所有不同类型ActionResult
的抽象基类,如ViewResult
,JsonResult
和PartialViewResult
。一些开发人员更喜欢将ActionResult作为其所有方法的返回类型。其他人尝试声明最具体的返回类型。我更喜欢使用后者。特别是当单元测试时,这使得代码更容易使用,因为您可以直接使用结果。
ViewResult
和PartialViewResult
之间的差异与使用布局页面有关。由于PartialView用于返回可嵌入另一页面的单个HTML,因此您不希望使用布局页面。 ViewResult
返回一个完整视图,其中包含使用布局页面的选项。
答案 1 :(得分:2)
您看到错误是因为您没有将预期的IEnumerable<MDISS.ViewModel.RSS>
模型传递到"_HealthCareNews"
部分视图:
<div id="rightColumn">
@Html.Partial("_HealthCareNews" /*Model required here*/)
</div>
你可以使用以下其中一项:
@Html.RenderAction("HealthCareNews")
@Html.Action("HealthCareNews")
这些方法将调用您创建的HealthCareNews
控制器操作,该操作会使用相应的"_HealthCareNews"
模型正确加载rssList
部分视图。
然而
我个人更喜欢在我的剃刀视图中调用部分内容,从我的视图模型中传入任何所需的模型。使用您的示例,这可能如下所示:
<强>视图模型强>
public class AboutPageViewModel
{
public IEnumerable<MDISS.ViewModel.RSS> RssList { get; set; }
}
<强>控制器强>
public ActionResult About()
{
return View(new AboutPageViewModel { RssList = rssList });
}
Razor查看
@model AboutPageViewModel
<div id="rightColumn">
@Html.Partial("_HealthCareNews", Model.RssList)
</div>