使用IEnumerable作为模型渲染局部视图

时间:2013-08-29 10:28:41

标签: asp.net-mvc

我想渲染一个局部视图,其中包含从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
}

当我尝试打开关于页面时,出现以下错误:

对象引用未设置为对象的实例。

2 个答案:

答案 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中的操作方法返回ActionResultActionResult是MVC中存在的所有不同类型ActionResult的抽象基类,如ViewResultJsonResultPartialViewResult。一些开发人员更喜欢将ActionResult作为其所有方法的返回类型。其他人尝试声明最具体的返回类型。我更喜欢使用后者。特别是当单元测试时,这使得代码更容易使用,因为您可以直接使用结果。

ViewResultPartialViewResult之间的差异与使用布局页面有关。由于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>