将不同的模型传递给RenderPartial()

3
我正在将一些部分视图链接在一起,并需要一种方法在调用RenderPartial()时使用不同的模型。大多数stackoverflow上的答案都建议强制转换为模型类型,但这在编译时是无法知道的。
该网站有不同的类别,例如汽车、飞机、直升机和船只。当用户点击汽车链接时,汽车控制器的索引页面会以漂亮的表格显示所有汽车。其他类别也是如此。 所有表格都是相同的,因此我想使用部分视图来重用代码。
@model IEnumerable<MyNamespace.Entities.Car>
@{Html.RenderPartial("Partials/_TableList", Model);}

在_TableList.cshtml中有一个漂亮的表格。现在我想调用另一个部分视图,它需要一个类型为Car的模型列表,并输出表头和正文。同样地,如果用户点击了Planes,这将加载一个接受Plane模型列表的部分视图。
<table class="table prettyTable">
@{Html.RenderPartial((string)ViewBag.PartialToLoad, Model);}
</table>

在_CarList.cshtml中

@model IEnumerable<MyNamespace.Entities.Car>
<thead>...</thead>
<tbody>
@foreach (var item in Model)
{ ... }
</tbody>

这可以实现吗?还是必须将模型放在ViewBag中并传递它?

编辑:感谢@Adas,我通过添加以下代码解决了这个问题:

@model IEnumerable<dynamic>

将代码添加到_TableList.cshtml的顶部。现在,当我调用RenderPartial()时,它不会抱怨“扩展方法无法动态调度”。这个现在完美地工作了:
<table class="table prettyTable">
@{Html.RenderPartial((string)ViewBag.PartialToLoad, Model);}
</table>

进一步编辑:我发现尽管上面的方法可以与IEnumerable一起使用,但无法与@model dynamic一起使用。我发现可以这样调用RenderPartial,在这种情况下可以正常工作。
@{RenderPartialExtensions.RenderPartial(Html, (string)ViewBag.PartialToLoad, Model);}

在控制器中设置了 ViewBag 中的 PartialToLoad。


1
为什么不在您的模型中使用多态? - emre nevayeshirazi
1个回答

2
您有三种选择:
  1. 使用动态模型,即@model IEnumerable<dynamic>
  2. 在您的模型上实现一些常见接口并使用它@model IEnumerable<IYourCommonInterface>
  3. 从某个公共类继承所有模型,就像emre nevayeshirazi评论中提到的那样,@model IEnumerable<YourBaseClass>
无论您将模型传递给Model还是将其放入ViewBag中,都需要使用上述方法之一来访问公共方法。

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