2013-08-07 3 views
2

У меня есть строковый вид, определенный с помощью @model MyNamespace.Customer с формой, созданной с помощью вспомогательного помощника Html.BeginForm("NewCustomer", "CustomerReg", FormMethod.Post).Передача строго типизированных данных из представления в контроллер

Действие NewCustomer на моем контроллере CustomerRegController выглядит

[HttpPost] 
public ViewResult NewCustomer(MyNamespace.Customer objCustomer) 

Я «начинка» из модельного переплета полей на странице часть полого Заказчика.

Когда я отправляю, я попадаю в правильное действие, но objCustomer - это все начальные значения. Хотя я мог бы передавать строго типизированные данные таким образом; Я делаю что-то неправильно?

+0

Вы используете textboxfor и т. Д. Для всех ваших входов? – Charles380

+0

обычно да, за несколькими исключениями. – cori

+0

, чтобы уточнить, есть несколько элементов @ Html.DropDownListFor или CheckBoxFor. – cori

ответ

1

Тот факт, что ваше представление строго типизировано до @model MyNamespace.Customer, не означает, что эта модель каким-то образом будет автоматически отправлена ​​на ваше действие при отправке формы. В основном вам нужно иметь поля ввода для каждого свойства, которое вы хотите получить в своей форме, если вы хотите, чтобы это свойство передавалось вашему POST-действию.

Также убедитесь, что этот объект Customer является POCO с конструктором по умолчанию (без параметров), в котором каждое свойство, которое вы хотели бы получить, имеет общедоступные получатели и сеттеры. В противном случае связующее устройство по умолчанию никогда не сможет десериализовать запрос к этой модели. Идеальным решением этой проблемы является использование модели представления, которая представляет собой класс, который вы специально разрабатываете, чтобы соответствовать требованиям вашего представления и прекратить передавать вам свои модели домена. Разумеется, эта модель представления имеет конструктор по умолчанию и публичные сеттеры и геттеры для всех свойств, которые вы хотите получить.

+0

В настоящее время мы используем общую модель доменной модели для получения этих POCO через барьер - мы можем отойти от этого подхода к ViewModel, поскольку мы немного продвигаемся по дороге, но пока это приемлемая методология для нас. Все свойства имеют публичные геттеры и сеттеры, и существует конструктор без параметров, поэтому класс должен быть полностью сериализуемым. – cori

+0

Я предполагаю, что я все еще не уверен, привязываю ли я текстовое поле (model => model.STreetAddress) (например) и отправлю форму, ожидая, что действие получит клиент с помощью StreetAddress? Или мне нужно будет заполнить клиента в моем действии из значений Request.Form? Или я пропустил какую-то другую часть уравнения? Я уверен, что я вижу сильно типизированные объекты в качестве параметров действия, но я еще не сделал столько работы в MVC. – cori

+0

Нет в этом случае свойство 'StreetAddress' вашей модели будет автоматически привязано. Вам вообще не нужно использовать 'Request.Form'. Модельное связующее автоматически привяжет значения запроса к вашей модели, предполагая, что имена ваших полей ввода соответствуют стандартным соглашениям об именах. –

Смежные вопросы