0

フォーム内のオブジェクトのコレクションにインクリメンタルシーケンスを使用しています。DropDownListForを使用する必要がある場合を除いて、すべて正常に機能します。ドロップダウンのバインドと正しい値の選択に関する多くの質問がありますが、私の場合は問題なく機能しています。ただし、コントローラーのHttpPostアクションに何が含まれるべきかがわかりません。これが私のコードです:

モデル

public class WorkRequestList
{
    public WorkRequest[] Requests { get; set; }
    public Vehicle[] Vehicles { get; set; }       
}

意見

 <% using (Html.BeginForm()) {%>
     <% for (var i = 0; i < Model.Requests.Count(); i++) { %>
        <%=Html.DropDownListFor(x => x.Requests[i].AssignedTo,new SelectList(Model.Vehicles,"Id","Name",Model.Requests[i].AssignedTo.Id)) %>
      <%}%>
 <%=Html.SubmitButton("TopSubmit","Submit") %>
<%}%>

投稿されたアクション

[HttpPost]
public ActionResult Schedule(WorkRequestList form)
{
      //what goes here?
}

ドロップダウンリストは適切に入力され、事前に選択されています。しかし、ポストバックではform.Requests.AssignedToはnullです。Vehicle Idがどこかにポストバックされていると思いますが、Request魔法の文字列をループすることなく、どうすればそれに到達できますか?

var id = Request["Requests[" + i + "].AssignedTo"];
4

1 に答える 1

1

明示的なモデルバインダーなしではサブオブジェクトをバインドできなかったため、別のアプローチを次に示します。

応答の新しいクラスを定義します。

public class WorkRequestResponse 
{
    public int AssignedTo { get; set; }
}

ページで次のように変更します: (リクエストを WorkRequest に変更しました)

<% for (var i = 0; i < Model.WorkRequest.Count(); i++)
       { %>
    <%=Html.DropDownListFor(x => x.WorkRequest[i].AssignedTo, new SelectList(Model.Vehicles, "Id", "Name", Model.WorkRequest[i].AssignedTo.Id))%>
    <%}%>

コントローラーで次のようにバインドします。

public ActionResult Index([Bind(Prefix = "WorkRequest")]List<WorkRequestResponse> AssignedTo)
{
    // AssignedTo is now populated
    WorkRequestList.WorkRequests = magic_assign_function(AssignedTo); 
    // manual model validation etc....
}

これも私を悩ませているので、もっと直接的なルートがあるかどうかを知りたいと思います.

于 2010-03-31T02:12:33.243 に答える