自動生成されたコントロールを含むフォームの適切な送信
-
05-07-2019 - |
質問
ベース: MVC Html.CheckBoxとフォーム送信の問題
次の例を考えてみましょう。表示:
<% using(Html.BeginForm("Retrieve", "Home")) %>
<% { %>
<%foreach (var app in newApps) { %>
<tr>
<td><%=Html.CheckBox(""+app.ApplicationId )%></td>
</tr>
<%} %>
<input type"submit"/>
<% } %>
コントローラー:
List<app>=newApps; //Database bind
for(int i=0; i<app.Count;i++)
{
var checkbox=Request.Form[""+app[i].ApplicationId];
if(checkbox!="false")// if not false then true,false is returned
}
提案された解決策は、MVCの概念からは思えないRequest.Formの手動解析に関するものでした。このコントローラーメソッドの単体テスト中に問題が発生します。この場合、入力パラメーターとして渡されるViewModelの代わりに、模擬Request.Formオブジェクトを生成する必要があります。
Q:送信されたコントロールのコレクションを含むViewModelオブジェクトが入力パラメーターとしてコントローラーメソッドに渡されるように、このようなフォームを送信する他のソリューションはありますか?
例:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Retrieve(AppList[] applist)
または
public ActionResult Retrieve(AppList<App> applist)
etc
解決
コントローラー:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Retrieve(AppList[] applist)
表示:
<% using(Html.BeginForm("Retrieve", "Home")) %> { %>
<%foreach (var app in newApps) { %>
<tr>
<td><%=Html.CheckBox(String.Format("appList[{0}].AProperty", app.ApplicationId) %></td>
</tr>
<% } %>
<input type"submit" />
<% } %>
これを読む: Scott HanselmanのComputerZen.com-モデルバインディング用ASP.NETワイヤフォーマット、リスト、コレクション、辞書
更新:
ApplicationIdがDBのキーである場合、AppList<App>
をActionパラメーターとして使用することをお勧めします。次に、フォームは次のようになります。
<% using(Html.BeginForm("Retrieve", "Home")) %> { %>
<% var counter = 0; %>
<% foreach (var app in newApps) { %>
<tr>
<td><%=Html.CheckBox(String.Format("appList[{0}].Key", counter), app.ApplicationId) %></td>
<!-- ... -->
<td><%=Html.Input(String.Format("appList[{0}].Value.SomeProperty1", counter), app.SomeProperty1) %></td>
<td><%=Html.Input(String.Format("appList[{0}].Value.SomePropertyN", counter), app.SomePropertyN) %></td>
<% counter = counter + 1; %>
</tr>
<% } %>
<input type"submit" />
<% } %>
所属していません StackOverflow