Имея некоторые проблемы, пытающиеся привязать модель к моей модели представления.Ошибка привязки модели MVC3 с EditorTemplates
Основная ViewModel таким образом:
public class RegistrationVM
{
public TravelHistoryVM TravelHistory {get;set;}
public UserDetailVM UserDetails {get;set;}
public ICollection<HandsetDevicesVM> ExistingDevices {get;set;}
}
Оболочка для дальнейших 3 ViewModels, каждая из которых содержит обычную группу строк, и целых чисел BOOLS. Игнорировать коллекцию HandsetDevicesVM пока.
У меня есть следующий вид (образец для ясности)
@using (Html.BeginForm())
{
@Html.ValidationSummary(false)
@Html.LabelFor(model => model.TravelHistory.DoNotTravel)
@Html.CheckBoxFor(model => model.TravelHistory.DoNotTravel)
@Html.EditorFor(model => model.UserDetails, "UserDetailsHidden")
}
Объект «» TravelHistory в настоящее время оценка отлично, никаких проблем. Объект UserDetails всегда равен нулю, когда данные отправляются назад.
Шаблон определенно рендеринга, я могу сказать из HTML. Сам шаблон приведен ниже:
@model Foo.Bar.UserDetailVM
@Html.HiddenFor(model => model.EmailAddress)
@Html.HiddenFor(model => model.FirstName)
@Html.HiddenFor(model => model.Surname)
@* etc etc *@
HTML генерируемый
<input data-val="true" data-val-required="The Email Address field is required." id="UserDetails_EmailAddress" name="UserDetails.EmailAddress" type="hidden" value="[email protected]" />
<input data-val="true" data-val-required="The First Name field is required." id="UserDetails_FirstName" name="UserDetails.FirstName" type="hidden" value="Stack" />
<input data-val="true" data-val-required="The Surname field is required." id="UserDetails_Surname" name="UserDetails.Surname" type="hidden" value="Overflow" />
Я использую этот EditorTemplate на другой точке зрения без каких-либо проблем (не связывается с этой ViewModel не проблема).
Наконец, с помощью Fiddler я могу определить, информация быть вывешенным .. Я думаю
UserDetails.EmailAddress=stack%40overflow.com.test&UserDetails.FirstName=stack&UserDetails.Surname=overflow
Любые идеи? Где я должен сосредоточиться на моих усилиях по отладке?
Edit1: только что заметил это от объекта ModelState
AttemptedValue: 'Foo.Bar.UserDetailVM'
Так что, кажется, он пытается связать значение строки «Foo.Bar.UserDetailVM» к объекту и (очевидно) терпит неудачу.
Edit2:
[HttpPost]
public ActionResult Travel(RegistrationVM model)
В соответствии с просьбой, действие я отправляю к
EDIT3:
Ааа .. OK вернуться на сцену, это метод действия, который служит вверх по Просмотр
[HttpGet]
public ActionResult Travel(PreRegistrationVM model)
{
if (TempData["PreRegistrationVM"] != null)
{
model = (PreRegistrationVM)TempData["PreRegistrationVM"];
}
var newModel = new RegistrationVM(model);
return View(newModel);
}
Это то, что я использовал (и, таким образом, был частью процесса tha t не работает). По существу, информация с предыдущего шага сохраняется в TempData и выбирается в этом методе. Затем он используется для создания виртуальной машины, как указано выше. На этом этапе (если я вставляю здесь точку останова), модель заполняется данными, как я ожидаю.
Если бы я изменить что к следующему:
[HttpGet]
public ActionResult Travel(PreRegistrationVM model)
{
var newModel = new RegistrationVM
{
FirstName = "Stack",
Surname = "Overflow"
};
return View(newModel);
}
Он связывает, как и ожидалось. Является ли TempData виновником?
Не могли бы вы указать точную подпись действия, которое вы отправляете эту форму? –
1 - Я предполагаю, что вы отправляете обратно в «RegistrationVM»? 2 - Также, почему вы используете EditorTemplate для этого, когда пользователю нечего редактировать? DisplayTemplate будет более подходящим выбором. 3 - Если вы поместите другой параметр в свой метод действий, который является 'UserDetailsVM', он правильно связывается? Я бы подумал, что вам понадобится ваш 'yourVariable.UserDetails.EmailAddress' для правильной привязки. – Tejs
Я подозреваю, что проблема заключается в том, что вы не разместили. Я не вижу ничего плохого в том, что вы делаете. –