Этот вопрос был asked before в более ранних версиях MVC. Существует также this blog entry о способе решения этой проблемы. Мне интересно, представила ли MVC3 что-нибудь, что может помочь, или если есть другие варианты.Связывание с полиморфной моделью
В двух словах. Вот ситуация. У меня есть абстрактная базовая модель и 2 конкретных подкласса. У меня есть строго типизированный вид, который отображает модели с EditorForModel()
. Затем у меня есть настраиваемые шаблоны для каждого конкретного типа.
Проблема возникает при публикации. Если я сделаю метод post action принятым базовым классом в качестве параметра, то MVC не сможет создать абстрактную версию его (чего я бы не хотел, я бы хотел, чтобы он создал конкретный конкретный тип). Если я создаю несколько методов post action, которые различаются только сигнатурой параметра, тогда MVC жалуется, что он неоднозначен.
Итак, насколько я могу судить, у меня есть несколько вариантов решения этой проблемы. Мне не нравится ни один из них по разным причинам, но я перечислил их здесь:
- Создайте собственное связующее устройство, которое предлагает Дарин в первом посте, с которым я связан.
- Создайте атрибут дискриминатора как второе сообщение, которое я связал с предложениями.
- Опубликовать по разным методам действий, основанные на типе
- ???
Мне не нравится 1, потому что это в основном конфигурация, которая скрыта. Некоторый другой разработчик, работающий над кодом, может не знать об этом и тратить много времени на то, чтобы выяснить, почему вещи ломаются, когда меняются вещи.
Мне не нравится 2, потому что это кажется хаккойным. Но я склоняюсь к этому подходу.
Мне не нравится 3, потому что это означает нарушение DRY.
Любые другие предложения?
Edit:
Я решил пойти с методом Дарин, но сделал небольшое изменение. Я добавил это к моей абстрактной модели:
[HiddenInput(DisplayValue = false)]
public string ConcreteModelType { get { return this.GetType().ToString(); }}
Затем скрытом автоматически получает генерируется в моей DisplayForModel()
. Единственное, что вы должны помнить, это то, что если вы не используете DisplayForModel()
, вам придется добавить его самостоятельно.
Хм .. Это определенно улучшает ремонтопригодность. И это будет работать там, где ваши конкретные модели не отличаются по сигнатурам свойств (недостаток в методе Attribute). Не уверен, что мне нравится загрязнять мои взгляды этими дискриминаторами. –
Я выбрал ваше решение, но сделал небольшое изменение. См. Мое редактирование. –
Я понял другое решение (см. Мой ответ), который оказался намного более простым и немного более безопасным, поскольку он не предполагает выставлять ему тип данных клиенту и надеется, что он не был испорченный хакером. –