我正在尝试重用一些代码,部分视图似乎是使用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。
错误:
对象引用未设置为对象的实例。
有人可以告诉我,我是否正在做正确的事情以及我出错的地方,除了它是空的吗?
答案 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>
输出
答案 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问题。