2013-05-14 2 views
1

Прежде чем я начну, я смотрел на этот вопрос:Список при переходе от представления модели в ASP.Net MVC

asp.net mvc model binding fails for <List> items in editor template

У меня есть модель, которая выглядит, как так:

public class PartnerListModel 
{ 
    public List<PartnersModel> Partners { get; set; } 

    public PartnerListModel() 
    { 
     Partners = new List<PartnersModel>(); 
    } 
} 

И тогда мой PartnersModel выглядит так:

public class PartnersModel 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public bool IsActive { get; set; } 
} 

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

using (Html.BeginForm("Update", "Partners", FormMethod.Post)) 
      { 
       @Html.EditorFor(m => m.Partners) 
       <input type="submit" value="Submit Changes"/> 
      } 

И, наконец, мой шаблон редактора выглядит следующим образом: действие

@model AdminWebsite.Models.Partners.PartnersModel 
<div> 
    <span> 
     @Html.DisplayFor(m => m.Name) 
    </span> 
    <span> 
     @Html.EditorFor(m => m.IsActive) 
    </span> 
    @Html.HiddenFor(m => m.ID) 
    @Html.HiddenFor(m => m.Name) 
</div> 

моего контроллера как это так, и код на самом деле удастся попасть в этом действие:

public ActionResult Update(PartnerListModel partners) 

Почему мой список внутри модели имеет счет 0? Я не могу найти причину, почему мой пример отличается от принятого ответа на Stack Overflow. Есть ли что-то, что мне не хватает, что объясняет, почему мои данные передаются обратно, не добавляются в список?

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

  • Partners [0] = .IsActive верно
  • Partners [0] .IsActive =
  • ложно
  • партнеры [0] .Name = "Привет"
  • партнеры [0] = 1 .id
  • партнеры [1] .IsActive = ложь т.д.

Любые идеи? Заранее спасибо.

+0

Partners [0] .IsActive в два раза? см. ваш результат хром –

+0

Да, он там дважды. В соответствии с инфраструктурой MVC CheckboxFor создает скрытое поле со значением false, а также поле ввода, потому что оно должно публиковать ложное значение, если флажок не установлен. – AlbertoPL

ответ

3

Вы передаете List<PartnersModel> методу действия, но действие-метод ожидает PartnerListModel.

Вы должны изменить Action-метод как это:

public ActionResult Update(List<PartnersModel> partners) 

Причина этого заключается в том, что по умолчанию ModelBinder не на самом деле гнездо графа. Если вы хотите получить доступ к обоим пунктам, вам нужно будет сделать включать оба параметра:

public ActionResult Update(PartnerListModel partnerlistmodel, List<PartnersModel> partners){ 

} 

Если вы хотите вложенную модель, вам придется реализовать свой собственный ModelBinder.

Следующий вопрос имеет аналогичную проблему: Binding an editable list of children

+0

Предположим, он хотел полностью вернуть ViewModel 'PartnerListModel', что бы изменилось, чтобы привести к этому? –

+0

Вы были на месте! Почему я пропускаю List , хотя? Также следует отметить, что параметр action-method NEEDS, который будет называться партнерами в этом случае, или вы получите ошибку конструктора без параметров. Я оставляю это здесь для дальнейшего использования. – AlbertoPL

+0

Я не уверен в этом на 100%, но я считаю, что, увидев, что в запросе нет других данных, он оставляет вне корневой объект. Не 100%, расследуют сейчас, и я вернусь с моими результатами. – Kenneth

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