2013-05-13 4 views
4

Таким образом, у меня есть представление, которое требует нескольких разных объектов и списков объектов, которые необходимо передать и удалить, для которых я создал viewmodel. Мой ViewModel выглядит следующим образомМодель MVC 4 возвращается назад

public class EditUserViewModel 
{ 
    public ManageUsersViewModel ManageUsersViewModel { get; set; } 
    public IEnumerable<StateModel> StateModel { get; set; } 
} 

Часть, у меня возникают проблемы с является StateModel, который выглядит следующим образом

public class StateModel 
{ 
    public bool IsChecked { get; set; } 
    public States States { get; set; } 
    public UsersInStates UsersInStates { get; set; } 
} 

и содержит этот

[Table("States")] 
public class States 
{ 
    [Key] 
    public int StateId { get; set; } 
    public string State { get; set; } 
} 

[Table("UsersInStates")] 
public class UsersInStates 
{ 
    [Key, Column(Order = 1)] 
    public int UserId { get; set; } 
    [Key, Column(Order = 2)] 
    public int StateId { get; set; } 
    public string LicenseNumber { get; set; } 
} 

На мой взгляд, я более или менее пытаясь перебрать состояния и ввести пользовательский ввод для UsersInStates. Вот как я пытаюсь это сделать, но вся моя StateModel возвращается null. Переход к представлению StateModel.States имеет данные, а UsersInStates - нет. Это то, на что похоже, на мой взгляд.

@foreach (var state in Model.StateModel) 
{ 
    @Html.HiddenFor(m => state) 
    <tr> 
     <td> 
      @Html.CheckBoxFor(m => state.IsChecked) 
     </td> 
     <td> 
      @Html.Label(state.States.State) 
     </td> 
     <td> 
      @Html.EditorFor(m => state.UsersInStates.LicenseNumber) 
     </td> 
    </tr> 
} 

Любые советы будут высоко оценены. Все отображает как следует, и часть ManageUsersViewModel работает нормально, так как данные StateModel, возвращающиеся к контроллеру, равны нулю, и я не совсем уверен, как сделать эту работу так, как мне хотелось бы.

Это то, что сгенерированный HTML выглядит для начала таблицы и первой строки в соответствии с просьбой

<table style="margin-left:auto; margin-right:auto; text-align:center"> 
<input id="state" name="state" type="hidden" value="WebSiteNew.Models.StateModel" />     <tr> 
       <td> 
        <input data-val="true" data-val-required="The IsChecked field is  required." id="state_IsChecked" name="state.IsChecked" type="checkbox" value="true" /> <input name="state.IsChecked" type="hidden" value="false" /> 
       </td> 
       <td> 
        <label for="Alabama">Alabama</label> 
       </td> 
       <td> 
        <input class="text-box single-line" id="state_UsersInStates_LicenseNumber" name="state.UsersInStates.LicenseNumber" type="text" value="" /> 
       </td> 
      </tr> 

Ответ:

Хорошо, таким образом, чтобы решить эту проблему я использовал для цикла, как объясняется в обеих ссылках, перечисленных в ответе ниже

@for (int i = 0; i < Model.StateModel.Count(); i++) 
{ 
    <tr> 
     <td> 
      @Html.HiddenFor(m => m.StateModel[i].States.StateId) 
      @Html.HiddenFor(m => m.StateModel[i].States.State) 
      @Html.CheckBoxFor(m => m.StateModel[i].IsChecked) 
     </td> 
     <td> 
      @Html.Label(Model.StateModel[i].States.State) 
     </td> 
     <td> 
      @Html.EditorFor(m => m.StateModel[i].UsersInStates.LicenseNumber) 
     </td> 
    </tr> 
} 

также примечание к любому, глядя на это, я должен был изменить IEnumer в моем EditUsersViewModel для IList, чтобы можно было индексировать.

+0

Можете ли вы показать, как выглядит сгенерированный HTML? – CorrugatedAir

+0

Да, я обновил свой пост. – aw04

+0

. Добавить метод контроллера для обратной передачи. –

ответ

6

Итак, ваша проблема заключается в том, что привязка к модели не происходит правильно.

Скажем, у вас есть эти две модели:

public class ParentModel 
{ 
    public string Name {get;set;} 
    public ChildModel Child {get;set;} 
} 

public class ChildModel 
{ 
    public string ChildName {get;set;} 
    public int SomeNumber {get;set;} 
} 

Ваш сгенерированный HTML (для вашей модели связывания правильно случаться) должен выглядеть следующим образом:

<input name="Name" value="(Not relevant to this example)"/> 
<input name="Child.ChildName" value="(Not relevant to this example)" /> 

Обратите внимание, как структурировано поле имени - так MVC определяет, какие входные значения отображают свойства в вашей модели представления. С вложенным свойством имя свойства должно идти перед ним.

С коллекциями он усложняется. Связующее устройство модели должно знать, какие значения идут с каким экземпляром свойства.

Например, если мы предположим, что ChildModel имеет тип IEnumerable в предыдущем примере, ваш HTML может выглядеть примерно так, чтобы смоделировать привязку правильно:

<input name="Name" value="(Not relevant to this example)"/> 
<input name="Child[0].ChildName" value="(Not relevant to this example)" /> 
<input name="Child[0].SomeNumber" value="(Not relevant to this example)"/> 
<input name="Child[1].ChildName" value="(Not relevant to this example)" /> 
<input name="Child[1].SomeNumber" value="(Not relevant to this example)"/> 

Взгляните на них для того, как исправить:

http://seesharpdeveloper.blogspot.com/2012/05/mvc-model-binding-to-list-of-complex.html http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

Редактировать - важно также отметить, что, когда Html Helpers GE nerate значения имени, оно основано на значении лямбды, который передается. Так

@Html.CheckBoxFor(m => state.IsChecked) 

генерирует следующее имя

name="state.IsChecked" 

Поскольку вы в Еогеаспе, вы получаете неправильно значение для имени.

+0

Отличное объяснение, спасибо. Взгляни сейчас. – aw04

1

Что вы пытаетесь выполнить с помощью @Html.HiddenFor(m => state) - из вынесенного HTML, который выглядит как ваш преступник прямо там. Будет ли более целесообразным @Html.HiddenFor(m => state.StateId)?

Кроме того, вы можете бросить это в первый элемент <td>, так как он скрыт и сохранит ваш HTML.

+0

. Хорошее место. Думаю, я смутил себя своими собственными соглашениями об именах ... это должно быть @ Html.HiddenFor (m => state.States) или @Html. HiddenFor (m => state.States.State) и @ Html.HiddenFor (m => state.States.StateId). Это не проблема, но я все равно получаю нулевое значение. – aw04

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