Связывание полиморфной модели

Этот вопрос задавался до в более ранних версиях MVC. Есть также эта запись в блоге о способах решения проблемы. Мне интересно, ввел ли MVC3 что-нибудь, что могло бы помочь, или есть ли другие варианты.

В двух словах. Вот такая ситуация. У меня есть абстрактная базовая модель и 2 конкретных подкласса. У меня строго типизированное представление, которое отображает модели с помощью EditorForModel () . Затем у меня есть собственные шаблоны для рендеринга каждого конкретного типа.

Проблема возникает во время публикации. Если я заставлю метод post action использовать базовый класс в качестве параметра, тогда MVC не сможет создать его абстрактную версию (чего я бы в любом случае не хотел, я бы хотел, чтобы он создавал реальный конкретный тип). Если я создаю несколько методов пост-действий, которые различаются только сигнатурой параметра, тогда MVC жалуется на неоднозначность.

Насколько я могу судить, у меня есть несколько вариантов решения этой проблемы. Мне не нравятся какие-либо из них по разным причинам, но я перечислю их здесь:

  1. Создайте настраиваемый связыватель модели, как предлагает Дарин в первом посте, на который я ссылался.
  2. Создайте атрибут дискриминатора, как предлагает второй пост, на который я ссылаюсь.
  3. Публикация различных методов действий на основе типа
  4. ???

Мне не нравится 1, потому что в основном это скрытая конфигурация. Другой разработчик, работающий над кодом, может не знать об этом и тратить много времени, пытаясь выяснить, почему что-то ломается, когда что-то меняет.

Мне не нравится 2, потому что это кажется хакерским. Но я склоняюсь к такому подходу.

Мне не нравится 3, потому что это означает нарушение DRY.

Есть ли другие предложения?

Редактировать:

Я решил пойти по методу Дарина, но сделал небольшое изменение. Я добавил это в свою абстрактную модель:

[HiddenInput(DisplayValue = false)]
public string ConcreteModelType { get { return this.GetType().ToString(); }}

Затем в моем DisplayForModel () автоматически создается скрытый. Единственное, что вам нужно запомнить, это то, что если вы не используете DisplayForModel () , вам придется добавить его самостоятельно.

56
задан Community 23 May 2017 в 12:17
поделиться