3

- -編集 - -

私はこのモデルを持っています

public class MainModel {
  string Name;
  List<Address> Addresses;
}

public class Address {
  string prop2;
}

ビューを作成するのは非常に簡単ですが、POST リクエストでそれをバインドする方法が見つかりませんでした。Request.Form でのループを避けたい

意見

  @foreach (var obj in Model.Address)
  {
    <tr>
      <td>            
        <input type="text" id="@string.Format("obj.Name.{0}", obj.Id)" name="@string.Format("obj.Name.{0}", obj.Id)" value="@Model.Name" />
        //I'm not able to overwrite the name attribute, still working on that
      </td>
    </tr>
  }

このリストを ActionController に自動的にバインドする方法はありますか? 何かのようなもの

public ActionResult Edit(MainModel model, List<Address> objects)

カスタム モデル バインディングを作成する必要があると思いますが、その方法がわかりません。

... MVC は私たちを怠惰にします ... :)

4

1 に答える 1

4

要件を読んでいると、解決策を考えすぎている可能性があります。

Views / EditorTemplatesフォルダーに、次のようなビューAddress.cshtmlを作成します。

@model SampleMvc.Models.Address
    <tr>
        <td>
            @Html.HiddenFor(x=>x.Id)            
            @Html.TextBoxFor(x=>x.Prop2)
        </td>
    </tr>

編集ビューには、次のようなマークアップがあります。

@using (Html.BeginForm()) {
    <table>
        @Html.EditorFor(x=>x.Name)
        <br/>
        <table>
            @Html.EditorFor(x=>x.Addresses)
        </table>
    </table>
    <input type="submit" id="submit" value="Submit"/>
}

EditorForステートメントは、アドレスエディターテンプレートを使用してマークアップをレンダリングします。

新しいアドレスを追加する機能が必要な場合は、クライアント側のスクリプトを使用して最高のIDを見つけ、次のマークアップを挿入できます。

<tr>
   <td>
      <input id="Addresses_{HIGHESTIDVALUEHERE}__Id" type="hidden" value="{HIGHESTIDVALUEHERE}" name="Addresses[{HIGHESTIDVALUEHERE}].Id" data-val-required="The Id field is required." data-val-number="The field Id must be a number." data-val="true">
<input id="Addresses_{HIGHESTIDVALUEHERE}__Prop2" type="text" value="" name="Addresses[{HIGHESTIDVALUEHERE}].Prop2">
   </td>
</tr>

次に、コントローラーのアクションは次のようになります

public ActionResult Edit(MainModel model){
}
于 2013-01-24T00:29:22.383 に答える