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