C# MVC局部视图
我试图重用一些代码,在使用MVC时,局部视图似乎是最好的方法 我创建了一个从IEnumerable继承的局部视图(见下文)C# MVC局部视图,c#,asp.net-mvc-3,C#,Asp.net Mvc 3,我试图重用一些代码,在使用MVC时,局部视图似乎是最好的方法 我创建了一个从IEnumerable继承的局部视图(见下文) @model IEnumerable<Models.facility> <div class="display-field"> @foreach (var facility in Model) { <li> @facility.name </li>
@model IEnumerable<Models.facility>
<div class="display-field">
@foreach (var facility in Model)
{
<li>
@facility.name
</li>
}
</div>
@model IEnumerable
@foreach(模型中的var设施)
{
@facility.name
}
嵌入此视图的视图如下所示:
<div class="display-field">
<div> @{Html.RenderPartial("FacilityPartial");} </div>
</div>
@{Html.RenderPartial(“FacilityPartial”);}
所以现在问题来了
我得到一个空引用错误,我可以看到模型变量为空
错误:
对象引用未设置为对象的实例
有人能告诉我,除了它为空之外,我是否做了正确的事情以及哪里出了错吗?使用Html.Partial。考虑这个例子。 索引视图(主页)
@{
ViewBag.Title=“主页”;
//要传递到局部视图的测试模型
var products=new List{new Product{ProductName=“测试产品1”,ProductId=1234};
}
@Html.Partial(“_TestPV”,产品)
\u测试PV(局部视图)
@model IEnumerable
@ActionLink(“新建”、“创建”)
产品名称
@foreach(模型中的var项目){
@Html.DisplayFor(modelItem=>item.ProductName)
}
输出:
您忘记将参数传递给局部视图,因此为空引用。应该是:
@{Html.RenderPartial("FacilityPartial", someIEnumerableVariableHere);}
调用
@{Html.RenderPartial(“FacilityPartial”);}
时,您提供了局部视图的名称,但忘记将模型作为参数包含在内。这就是为什么会出现空引用错误的原因,因为在呈现视图时,视图试图访问您在视图中声明为:
@model IEnumerable<Models.facility>
@model IEnumerable
如果将调用行更改为@{Html.RenderPartial(“FacilityPartial,model);}
,它应该可以工作。视图现在可以作用于传递给它的模型
作为旁注,@Jobbert Enmano接受的答案使用了
@Html.Partial
,而不是您在问题中使用的@Html.RenderPartial
。这两者之间的差异可能会让您或任何其他查看此问题的人感到困惑:
@Html.Partial
将渲染视图返回为MvcHtmlString
,因此如果需要,可以将其存储在变量中
@Html.RenderPartial
不返回任何内容,即void,因此直接输出到响应
流
就性能而言,通常最好使用后者。请参阅问题以获得更详细的答案。您是否在父视图中实例化了模型的实例?否。我该如何做以及在何处?如果在视图顶部添加多个@model,则会出现运行时错误:一个文件中只允许有一个“model”语句。@Joe有一个封装所有模型对象的基本模型,然后使用它,这是错误的。如果使用Html.RenderPartial并传递模型参数,则会出现编译器错误,因为这是一个void类型。现在运行时不会出错,但是我希望传递的模型只是一个包含该视图数据库表中所有记录的模型,即,我的局部视图以设施模型为模型,该模型以设施表为模型。我将如何传递我可以使用的包含设施表中所有记录的内容?然后,我可以简单地循环该表的所有db记录,并在我的视图中显示它。谢谢从您的控制器调用db获取设施列表,然后将其存储在ViewBag中。设施然后将其作为@Html.Partial(“FacilityPartial”,ViewBag.facilities as list)传递
@{Html.RenderPartial("FacilityPartial", someIEnumerableVariableHere);}
@model IEnumerable<Models.facility>