1

我想用从 rss 提要收到的新闻列表呈现部分视图。我有以下控制器:

RssFeed部分

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 页面

@model IEnumerable<MDISS.ViewModel.RSS>
@foreach(var item in Model)
{
//display list
}

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

你调用的对象是空的。

4

2 回答 2

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 方法可以构建局部视图所需的模型。

更新

MVC 中的操作方法返回一个ActionResult. 是MVC 中存在的ActionResult所有不同类型的 s 的抽象基类,例如,和. 一些开发人员更喜欢将 ActionResult 作为所有方法的返回类型。其他人则尝试声明最具体的返回类型。我更喜欢使用后者。特别是在单元测试时,这使代码更易于使用,因为您可以直接使用结果。ActionResultViewResultJsonResultPartialViewResult

ViewResultPartialViewResult与使用布局页面的区别。由于 PartialView 用于返回可以嵌入到另一个页面中的单个 HTML,因此您不想使用布局页面。AViewResult返回一个完整的视图,其中包含使用布局页面的选项。

于 2013-08-29T10:32:09.040 回答
3

您看到错误是因为您没有将预期的IEnumerable<MDISS.ViewModel.RSS>模型传递给"_HealthCareNews"局部视图:

<div id="rightColumn">
    @Html.Partial("_HealthCareNews" /*Model required here*/)
</div>

可以使用以下方法之一:

@Html.RenderAction("HealthCareNews")

@Html.Action("HealthCareNews")

这些方法将调用HealthCareNews您创建的控制器操作,该操作会正确加载具有适当模型的"_HealthCareNews"局部视图。rssList

然而

我个人更喜欢从我的 razor 视图中调用 partials,从我的视图模型中传入任何所需的模型。使用您的示例,这可能如下所示:

视图模型

public class AboutPageViewModel
{
    public IEnumerable<MDISS.ViewModel.RSS> RssList { get; set; }
}

控制器

public ActionResult About()
{ 
    return View(new AboutPageViewModel { RssList = rssList });
}

剃刀视图

@model AboutPageViewModel

<div id="rightColumn">
    @Html.Partial("_HealthCareNews", Model.RssList)
</div>
于 2013-08-29T10:38:29.917 回答