MVC部分视图

时间:2013-02-01 08:37:12

标签: c# asp.net-mvc-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>

所以现在问题。

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

错误:

  

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

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

3 个答案:

答案 0 :(得分: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>

输出

enter image description here

答案 1 :(得分:2)

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

@{Html.RenderPartial("FacilityPartial", someIEnumerableVariableHere);} 

答案 2 :(得分:0)

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

@model IEnumerable<Models.facility>

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

作为附注,@ Jobbert Enamno接受的答案使用@Html.Partial而不是您在问题中使用的@Html.RenderPartial。这些之间的差异可能会让您或其他任何人看到这个问题感到困惑:

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

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

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