Наследование и строго типизированные представления - PullRequest
1 голос
/ 03 июня 2011

У меня есть абстрактный класс 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 ]

2 голосов
/ 03 июня 2011

Попробовать именно то, что вы пытаетесь, невозможно. Если все, что вы делаете, это перечисление по коллекции (а не ее изменение), вы можете перейти к следующему, и все должно быть в порядке:

@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 голосов
/ 03 июня 2011

Вы можете сделать это следующим образом:

@{ Html.RenderPartial("ParialView", list.Cast<Foo>().ToList()); }

Тип времени выполнения List<FooBar> отличается от List<Foo>, и поскольку вы не используете ковариантные интерфейсы, вы не можете предполагать этопримет неявное приведение.

0 голосов
/ 03 июня 2011

Как насчет частичного просмотра коллекции Foo вместо коллекции FooBar?

@{ Html.RenderPartial("PartialView", MyFoobBarList.Cast<Foo>().ToList()); }

(кстати, вам действительно нужен список?)

0 голосов
/ 03 июня 2011

List<Foo> does not inherit from List<Foobar>, поэтому это не сработает ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...