Связывание модели коллекции MVC3 с EditorFor - PullRequest
2 голосов
/ 18 января 2012

Относительно этого сообщения и этого другого сообщения .

Предположим, у меня есть следующее:

public class Foo
{
   public string Value1 { get; set; }
   public string Value2 { get; set; }
}

public class BarViewModel
{
   public string Baz { get; set; }
   public IList<Foo> Foos { get; set; }
}

И у меня есть вид, который получает BarViewModel:

@model BarViewModel

@Html.EditorFor(model => model.Baz)

<table>
   @for(int i = 0 ; i < Model.Foos.Count ; i ++)
   {
      string name1 = "Foos[" + i.ToString() + "].Value1";
      string name2 = "Foos[" + i.ToString() + "].Value2";

      <tr>
        <td>
           <input type="text" name="@name1" value="@Model.Foos[i].Value1" />
        </td>
        <td>
           <input type="text" name="@name2" value="@Model.Foos[i].Value2" />
        </td>
      </tr>
   }
</table>

И в моем контроллере у меня есть метод POST, который получает BarViewModel.

Учитывая имена входных данных, сгенерированные для Value1 и Value2: "Foos[0].Value1" и "Foos[1].Value1" и т. Д., Коллекция в BarViewModel в методе POST автоматически заполняется ModelBinder. Потрясающе.

Проблема в том, что если я сделаю это так, на мой взгляд:

   @for(int i = 0 ; i < Model.Foos.Count ; i ++)
   {
      <tr>
        <td>
           @Html.EditorFor(model => model.Foos[i].Value1);
        </td>
        <td>
           @Html.EditorFor(model => model.Foos[i].Value2);
        </td>
      </tr>
   }

Тогда имена, сгенерированные для ввода, похожи на "Foos__0__Value1", и нарушают привязку модели . Свойство Foos моей BarViewModel в моем методе POST теперь null

Я что-то упустил?

Редактировать


Если я использую EditorFor на самой коллекции:

@EditorFor(model => model.Foos)

Имена генерируются правильно. Но это вынуждает меня создать ViewModel в / Views / Share для обработки типа Foos, который будет генерировать строку, которую я действительно не хочу делать ...

Редактировать 2


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

Если я это сделаю:

@EditorFor(model => model.Foos)

Имена входных данных будут иметь форму "Foos[0].Value1", и привязка модели отлично работает на сообщениях.

Но если я сделаю:

@for(int i = 0 ; i < Model.Foos.Count ; i ++)
{
    @EditorFor(model => Model.Foos[0].Value1)
}

Имена принимают форму "Foos__0__Value1", а привязка модели не работает . В моем методе сообщения model.Foos будет нулевым.

Есть ли причина, по которой второй синтаксис нарушает привязку модели?

1 Ответ

1 голос
/ 18 января 2012

Я не совсем уверен, что именно ваш вопрос.Однако так работает MVC.EditorFor использует EditorTemplates, и вы определяете шаблон редактора для вашего типа.Он не должен идти в Share, он может идти на любом уровне, который вы используете.Например, вы можете иметь его в /Views/Home/EditorTemplates/Foos.cshtml, если вы не используете его нигде, кроме вашего контроллера Home.

...