MVC2 Post с использованием подклассов - PullRequest
0 голосов
/ 03 мая 2011

Я строю одну страницу для редактирования различных типов продуктов.Каждый тип продукта имеет модель представления (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-магический, который никогда не является правильным подходом.

1 Ответ

1 голос
/ 03 мая 2011

Что следует помнить о MVC, так это то, что он основан на мышлении «Соглашение о конфигурации».Поэтому, если вы передаете экземпляр класса строго типизированного класса в свой метод действия, он ожидает, что он будет называться «модель».

Попробуйте изменить объявления так, чтобы они выглядели так:

<HttpPost()> Function EditTent(byval model as TentProductVM) As ActionResult
<HttpPost()> Function EditBoot(byval model as BootProductVM) As ActionResult

Другой (менее идеальный) вариант - ожидать объекта FormCollection в вашем методе действия.

<HttpPost()> Function EditTent(byval form as FormCollection) as ActionResult

Обновление

Просто обновление, чтобы включить некоторые обсуждениянесколько пунктов ниже ... Чтобы разместить строго типизированный объект в методе действия контроллера, типы должны совпадать.

Предполагается, что метод действия вашего контроллера выглядит следующим образом:

<HttpPost()> Function EditTent(byval model as ProductVM) As ActionResult

Ваше мнение должно быть напечатано соответственно:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Your.Namespace.ProductVM>" %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...