继承和强类型视图
本文关键字:视图 强类型 继承 | 更新日期: 2023-09-27 17:58:24
我有一个抽象类foo,它包含一些属性和方法。我还有许多实现foo的类,如barfoooobar。
为了在多个不同的视图上安全地重写相同的代码,我创建了一个强类型的局部视图
@model List<foo>
@foreach (var x in Model) {
<div> x.SomeProperty </div>
}
遗憾的是,当我试图用来称呼这种观点时
@{ Html.RenderPartial("PartialView", List<Foobar>); }
我得到以下错误
传递到字典中的模型项的类型为System。集合。通用的列出1[Namespace.Models.Foobar]', but this dictionary requires a model item of type 'System.Collections.Generic.List
1[Namespace.Models.Foo]'.
我想做的事情可能吗?还是我只需要复制代码?
尝试你正在尝试的东西是不可能的。如果您所做的只是枚举集合(而不是修改它),那么您可以更改为以下内容,一切都应该正常:
@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这样的协变接口可以让你做你需要的事情。
您可以这样做:
@{ Html.RenderPartial("ParialView", list.Cast<Foo>().ToList()); }
List<FooBar>
的运行时类型与List<Foo>
不同,并且由于您没有使用协变接口,因此不能假设它会接受隐式强制转换。
List<Foo> does not inherit from List<Foobar>
,所以这就是为什么它不起作用。。。
给局部视图提供Foo的集合而不是FooBar的集合怎么样?
@{ Html.RenderPartial("PartialView", MyFoobBarList.Cast<Foo>().ToList()); }
(顺便问一下,你真的需要这个列表吗?)