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变量为空。

错误信息:

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

请问有人能告诉我除了它是空的之外,我是否做得正确以及哪里出错了吗?


2
你在父视图中实例化了模型的实例吗? - Simon
不行。我该怎么做,去哪里?如果我在视图顶部添加多个@model,则会出现运行时错误:文件中只允许一个“model”语句。 - Yos
@Joe 有一个基础模型,它封装了所有的模型对象,然后使用它。 - DGibbs
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>

输出:

输入图像描述


现在这个程序已经可以无错误运行了,但是我想要传递的模型只是一个包含该视图数据库表中所有记录的模型,也就是说,我的部分视图是基于设施模型建立的,而设施模型又是基于设施表建立的。我应该如何传递一个包含设施表中所有记录的可用对象呢?然后我就可以简单地循环遍历该表中的所有记录,并在我的视图中显示它们。谢谢! - Yos
从您的控制器调用数据库以获取设施列表,然后将它们存储在ViewBag.Facilities中,然后将其作为@Html.Partial("FacilityPartial", ViewBag.Facilities as List<facility>)传递。 - Jobert Enamno

2
您忘记向部分视图传递参数,导致出现空引用错误。应该是这样的:
@{Html.RenderPartial("FacilityPartial", someIEnumerableVariableHere);} 

你错了。如果你使用Html.RenderPartial并传递模型参数,那么会得到编译器错误,因为它是void类型。 - Jobert Enamno

0

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

@model IEnumerable<Models.facility>

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

顺便提一下,@Jobbert Enamno的被接受的答案使用了@Html.Partial而不是你在问题中使用的@Html.RenderPartial。这两者之间的区别可能会让你或任何查看此问题的人感到困惑:

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

@Html.RenderPartial不返回任何东西,即void,并直接输出到Response流中。

从性能上讲,通常最好使用后者。有关更详细的答案,请参见this问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接