继承和强类型视图

本文关键字:视图 强类型 继承 | 更新日期: 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()); }

(顺便问一下,你真的需要这个列表吗?)