2012-04-18 1 views
2

Имея некоторые проблемы, пытающиеся привязать модель к моей модели представления.Ошибка привязки модели 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 виновником?

+0

Не могли бы вы указать точную подпись действия, которое вы отправляете эту форму? –

+0

1 - Я предполагаю, что вы отправляете обратно в «RegistrationVM»? 2 - Также, почему вы используете EditorTemplate для этого, когда пользователю нечего редактировать? DisplayTemplate будет более подходящим выбором. 3 - Если вы поместите другой параметр в свой метод действий, который является 'UserDetailsVM', он правильно связывается? Я бы подумал, что вам понадобится ваш 'yourVariable.UserDetails.EmailAddress' для правильной привязки. – Tejs

+0

Я подозреваю, что проблема заключается в том, что вы не разместили. Я не вижу ничего плохого в том, что вы делаете. –

ответ

0

Быстрая проверка фона: эта проблема возникла при создании «мастера» пошаговой регистрации.Я хотел бы избежать сохранения информации в базе данных до тех пор, пока регистрация не будет завершена. Следовательно, идея заключалась в том, чтобы использовать коллекцию TempData для хранения информации между действиями и использовать RedirectToAction для перехода от шага к этапу.

Для чего это стоит, я внес изменения в метод с использованием TempData как так

[HttpGet] 
public ActionResult Travel(PreRegistrationVM model) 
{ 
    if (TempData["PreRegistrationVM"] != null) 
    { 
     model = (PreRegistrationVM)TempData["PreRegistrationVM"]; 
    } 
    var newModel = new RegistrationVM(model); 
    return View(newModel); 
} 

Чтобы извлечь информацию из базы данных один раз за шагом в процессе регистрации.

[HttpGet] 
public ActionResult Travel(int id) 
{ 
    var model = FooRepository.GetById(id); 
    return View(model); 
} 

Я не совсем уверен, почему подход TempData привел к этому, было бы интересно узнать больше людей, чем я предлагаю причины.

Спасибо всем, кто ответил, помог мне отследить его.

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

  • Нет связанных вопросов^_^