我有一个抽象类 foo ,它包含一些属性和方法。我还有许多实现 foo 的类,例如 barfoo 和 foobar 。
为了安全地在多个不同的视图上重写相同的代码,我创建了一个强类型的局部视图
@model List<foo>
@foreach (var x in Model) {
<div> x.SomeProperty </div>
}
可悲的是,当我尝试用
调用此视图时@{ Html.RenderPartial("PartialView", List<Foobar>); }
我收到以下错误
传递到字典中的模型项的类型为System.Collections.Generic.List 1[Namespace.Models.Foobar]', but this dictionary requires a model item of type 'System.Collections.Generic.List
1 [Namespace.Models.Foo]'。
我正在尝试做什么,或者我只需要重复代码?
答案 0 :(得分:2)
你可以这样做:
@{ Html.RenderPartial("ParialView", list.Cast<Foo>().ToList()); }
List<FooBar>
的运行时类型与List<Foo>
不同,并且由于您没有使用协变接口,因此您无法假设它将接受隐式转换。
答案 1 :(得分:2)
尝试完全正在尝试的东西是不可能的。如果您所做的只是枚举集合(而不是修改它),您可以更改为以下内容并且事情应该没问题:
@model IEnumerable<foo>
@foreach (var x in Model) {
<div> x.SomeProperty </div>
}
如果你真的想到这个问题就很容易理解。
您的模型是List<foo>
。这意味着应该完全可以说Model.Add(new Barfoo());
。
您正在尝试传递List<Foobar>
作为模型。显然,Model.Add(new Barfoo());
在这种情况下会失败,因为它是不可能的。
使用像IEnumerable这样的协变界面可以让你完全按照自己的需要进行操作。
答案 2 :(得分:0)
List<Foo> does not inherit from List<Foobar>
这就是为什么这不起作用......
答案 3 :(得分:0)
如何为部分视图提供Foo集合而不是FooBar集合?
@{ Html.RenderPartial("PartialView", MyFoobBarList.Cast<Foo>().ToList()); }
(顺便说一下,你真的需要这份清单吗?)