Я строю одну страницу для редактирования различных типов продуктов.Каждый тип продукта имеет модель представления (TentProductVM, BootProductVM), которая наследуется от ProductVM.Мой MVC2 View проверяет тип модели и добавляет поля по мере необходимости.Например, если модель имеет тип BootProductVM, я вызываю Html.TextBoxFor, чтобы добавить поле для размера стопы загрузки.Страница отображается нормально.
Проблема в посте.Я объявил функцию (в VB) следующим образом:
<HttpPost()>Function Edit(byval prod as ProductVM) As ActionResult
Конечно, эта функция получает данные формы только из базового класса ProductVM.Поэтому вместо этого я добавил функцию для каждого типа продукта:
<HttpPost()>Function EditTent(byval prod as TentProductVM) As ActionResult
<HttpPost()>Function EditBoot(byval prod as BootProductVM) As ActionResult
и указал вид на соответствующую функцию публикации:
Using Html.BeginForm("Edit" & Model.ObjectTypeName, "Catalog")
Однако, когда вызывается EditTent или EditBoot, продуктПараметр содержит только данные из базового класса.Все поля, объявленные в моделях представления подкласса, имеют значения по умолчанию.
Что я делаю не так?Или есть лучший подход?(Очевидное решение - несколько страниц, но, поскольку ProductVM имеет много полей относительно подклассов, я бы предпочел этого не делать.)
После долгих экспериментов я решил не использовать этот подход.Во-первых, я не мог заставить его работать, не прибегая к параметру Action типа FormCollection.Во-вторых, очевидное решение, от которого я отказался, привлекательно, если я использую частичное представление.Частичное представление имеет все поля, связанные с базовым классом (ProductVM), оставляя только поля, связанные с производными классами (TentProductVM, BootProductVM) в обычных представлениях.
Чувствовалось, что я боролся с MVC auto-магический, который никогда не является правильным подходом.