2

この投稿とこの他の投稿について。

私が次のものを持っているとしましょう:

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"の場合、POSTメソッドのBarViewModelのコレクションは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"なり、モデルのバインディングが壊れます。FoosPOSTメソッドのBarViewModelのプロパティが次のようになりましたnull

私は何かが足りないのですか?

編集


EditorForコレクション自体で使用する場合:

@EditorFor(model => model.Foos)

名前は正しく生成されます。しかし、それは私にタイプを処理するために/ Views / ShareにViewModelを構築することを強制します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"を取り、モデルバインディングは機能しません。私のpostメソッドでは、model.Foosはnullになります。

2番目の構文がモデルのバインドを壊す理由はありますか?

4

1 に答える 1

1

私はあなたの質問が正確に何であるか完全にはわかりません。ただし、これがMVCの動作方法です。EditorForはEditorTemplatesを使用し、タイプのエディターテンプレートを定義します。Shareに入れる必要はなく、使用しているレベルに関係なく入れることができます。たとえば、ホームコントローラ以外の場所で使用していない限り、/ Views / Home / EditorTemplates/Foos.cshtmlで使用できます。

于 2012-01-18T16:48:41.847 に答える