继承与强类型观点

时间:2011-06-03 14:42:11

标签: c# asp.net-mvc inheritance razor

我有一个抽象类 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]'。

我正在尝试做什么,或者我只需要重复代码?

4 个答案:

答案 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()); }

(顺便说一下,你真的需要这份清单吗?)