3

我正在尝试重用一些代码,并且在使用 MVC 时,部分视图似乎是最好的方法。

我创建了一个继承自 IEnumerable 的局部视图(见下文)。

@model IEnumerable<Models.facility>

<div class="display-field">
    @foreach (var facility in Model)
    {
        <li>
            @facility.name
        </li>
    }
</div>

嵌入此视图的视图是这样的:

<div class="display-field">
    <div> @{Html.RenderPartial("FacilityPartial");} </div>
</div>

所以现在的问题。

我收到一个空引用错误,我可以看到模型变量为空。

错误:

你调用的对象是空的。

有人可以告诉我我是否在做正确的事情以及我哪里出错了,除了它是空的吗?

4

3 回答 3

3

使用 Html.Partial。考虑这个例子。

索引视图(主页)

 @{
        ViewBag.Title = "Home Page";
        //Test model to be passed to the partial view
        var products = new List<Product> { new Product{ProductName="Test product 1", ProductId=1234}};
    }
@Html.Partial("_TestPV", products)

_TestPV(局部视图)

@model IEnumerable<Product>
<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table>
    <tr>
        <th>
            ProductName
        </th>
    </tr>
@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.ProductName)
        </td>
    </tr>
}
</table>

输出:

在此处输入图像描述

于 2013-02-01T08:48:23.693 回答
2

您忘记将参数传递给局部视图,因此是空引用。应该:

@{Html.RenderPartial("FacilityPartial", someIEnumerableVariableHere);} 
于 2013-02-01T08:58:28.703 回答
0

当您调用时@{Html.RenderPartial("FacilityPartial");},您提供了局部视图的名称,但您忘记将模型作为参数包含在内。这就是为什么您收到空引用错误的原因,因为在呈现视图时,它正在尝试访问您在视图中声明的模型:

@model IEnumerable<Models.facility>

如果您将调用行更改为@{Html.RenderPartial("FacilityPartial", model);}它应该可以工作。视图现在可以作用于传递给它的模型。


作为旁注,@Jobbert Enamno 接受的答案与您在问题中使用的答案@Html.Partial相反。@Html.RenderPartial这些之间的区别可能会让您或其他查看此问题的人感到困惑:

@Html.Partial 将渲染视图返回为 a MvcHtmlString,因此您可以根据需要将其存储在变量中。

@Html.RenderPartial不返回任何内容,即 void,因此直接输出到Response流。

在性能方面,通常使用后者更好。有关更详细的答案,请参阅问题。

于 2016-01-23T22:33:39.423 回答