Универсальные модели C# 4.0 и ASP.net MVC

Похоже, что в C# 4.0 спецификаторы вариации применимы только к типам интерфейсов.

Итак, допустим, у меня есть классы ViewModel/EditModel и простая иерархия моделей.

class MyEditModel<T> where T : Base { ... }
class Derived1 : Base { ... }
class Derived2 : Base { ... }

У меня есть частичное представление, которое принимает MyEditModel любого типа (при условии, что оно является производным от Base), а другое — только экземпляры Derived1. Теперь, как мне отобразить оба на одной странице?

Частичное представление, которое принимает любую модель MyEditModel, будет совместно использоваться редактором для Derived1 и редактором для Derived2.


person MapDot    schedule 08.10.2010    source источник
comment
Эм, какой у тебя вопрос? Пожалуйста, отредактируйте.   -  person Thomas Weller    schedule 08.10.2010


Ответы (1)


Единственное, что вы можете сделать, это если ваше представление принимает модель представления Base. С точки зрения объектно-ориентированного программирования MyEditModel и Derived1 разделяют Base как общий базовый класс, но они не имеют ничего общего — других отношений нет. Следовательно, если вы пытаетесь использовать то же самое, оно должно быть получено из базы. Предположительно свойства на Базе — единственные, что у них есть общего.

Изменить: я неправильно истолковал исходный вопрос. Основываясь на буквальном тексте вашего вопроса, я думал, что вы передаете Derived1, но на основании вашего комментария ниже вы передаете MyEditModel<Derived1>. Это сделает то, что вы ищете:

Inherits="System.Web.Mvc.ViewPage<dynamic> 

Вы не получаете преимущества intellisense с динамическим, но вы получаете преимущество повторного использования одного и того же файла представления для ваших типов и преимущество отсутствия необходимости создавать дополнительные классы модели представления только для того, чтобы сделать компилятор счастливым.

person Steve Michelotti    schedule 08.10.2010
comment
Проблема в том, что вы передаете MyEditModel‹Derived1› или MyEditModel‹Derived2› чему-то, что принимает MyEditModel‹Base›. Это возможно только с интерфейсами. - person MapDot; 08.10.2010
comment
На данный момент мое неудачное решение включает в себя репликацию иерархии с помощью EditModels... Derived1EditModel, Derived2EditModel,... (очевидно, это не настоящие имена классов... У меня есть PageEditModel: ContentItemEditModel и MediaFileEditModel: ContentItemEditModel. Будет больше . - person MapDot; 08.10.2010
comment
@MapDot - я слишком буквально воспринял ваш вопрос, но ваш последний комментарий помогает его прояснить - я отредактировал свой ответ и проверил, что он работает. - person Steve Michelotti; 08.10.2010
comment
Я сохранил свое неудачное решение, потому что мне нужен IntelliSense, даже за счет некоторой избыточности кода. Спасибо хоть. - person MapDot; 11.10.2010