Проблема привязки модели ASP MVC2 к POST со строго типизированными помощниками HTML - PullRequest
3 голосов
/ 10 апреля 2010

Итак, я смотрю на переход с MVC 1.0 на MVC 2.0 RTM . Одно из соглашений, которое я хотел бы начать, заключается в использовании строго типизированных помощников HTML для создания элементов управления, таких как текстовые поля.

Однако, похоже, это не будет легким прыжком. Я попытался перенести мою первую форму, заменив строки следующим образом:

<%= Html.TextBox("FirstName", Model.Data.FirstName, new {maxlength = 30}) %>

... для таких строк:

<%= Html.TextBoxFor(x => x.Data.FirstName, new {maxlength = 30}) %>

Ранее это отображалось в соответствующую модель представления на POST, используя следующую сигнатуру метода:

[HttpPost]
public ActionResult Registration(AccountViewInfo viewInfo)

Вместо этого он в настоящее время возвращает пустой объект. Я полагаю, что разъединение заключается в том, что мы передаем модель представления в более крупный агрегатный объект, в котором есть некоторые метаданные страницы и другие забавные вещи (следовательно, x.Data.FirstName вместо x.FirstName).

Итак, мой вопрос: как лучше всего использовать помощников со строгой типизацией, при этом позволяя инфраструктуре MVC надлежащим образом приводить коллекцию форм к моей модели представления, как это происходит в исходной строке? Есть ли способ сделать это без изменения типа агрегата, который мы передаем представлению?

Спасибо!

ОБНОВЛЕНИЕ: Таким образом, атрибут связывания работал хорошо, но мне не понравилось, как мне пришлось применять его по существу к каждой опубликованной модели представления. Я закончил тем, что изменил иерархию наследования так, что все наши модели представлений наследуются от базового класса, который содержит содержимое страницы и другие метаданные, в отличие от агрегированного свойства с именем Data.

1 Ответ

5 голосов
/ 10 апреля 2010
public ActionResult Registration([Bind(Prefix = "data")] AccountViewInfo viewInfo);

Это сообщает связующему, что следует ожидать, что все значения начнутся с data , поэтому он будет искать data.FirstName и т. Д.

...