ASP.NET MVCで動的に生成されたフォームの出力をどのように処理しますか?

StackOverflow https://stackoverflow.com/questions/223149

  •  03-07-2019
  •  | 
  •  

質問

フォーム要素の動的な数を持つASP.NET MVCを使用してフォームを作成するとします。

たとえば、製品ごとにチェックボックスが必要です。製品の数は日々変わります。

コントローラにポストバックされるフォームデータをどのように処理しますか?返されるフォーム値の数がわからないため、アクションメソッドにパラメーターを設定できません。

役に立ちましたか?

解決

各チェックボックスに一意の名前値を指定するだけです:

<input class="approveCheck" id="<%= "approveCheck" + recordId %>" 
 name="<%= "approveCheck" + recordId %>" type="checkbox" />

送信後、アクション内のフォーム値のリストを解析します:

foreach (var key in Request.Form.Keys)
    {
        string keyString = key.ToString();
        if (keyString.StartsWith("approveCheck", StringComparison.OrdinalIgnoreCase))
        {
            string recNum = keyString.Substring(12, keyString.Length - 12);

            string approvedKey = Request.Form["approveCheck" + recNum];
            bool approved = !String.IsNullOrEmpty(approvedKey);
            // ...

フォームの値を引数として渡す必要はありません。 Request.Formから取得できます。

もう1つのオプション:モデルバインダーを作成して、リストをフォーム送信用のカスタムタイプに変更します。

他のヒント

Craigの回答ごと。同じ名前の複数のフォーム要素を投稿することには癖があります。 「コレクション」を作成するロジックをラップするのが賢明だと付け加えます。 WebFormsと同様の方法でのコントロールの。 Webフォームは、コンテナコントロールの名前を先頭に追加し、インデックスを追加します。たとえば、Repeaterでは、内部のフォーム要素にRepeaterName_Element1、RepeaterName_Element2などの名前が付けられます。要素を取り出すには、FindControlなどを使用する必要があります。

使用しているバインダーに応じて、これは機能するはずです:

<%var i = 0;
  foreach (var product (IList<ProductSelection>)ViewData["products"]) {%>
      <%=Html.Hidden(string.Format("products[{0}].Id", i), product.Id)%>
      <%=Html.Checkbox(string.Format("products[{0}].Selected", i))%>
      <%=product.Name%><br/>
<%}%>

...これにより、HTMLは次のようになります(名前の配列表記に注意してください):

<input name="products[0].Id" type="hidden" value="123">
<input name="products[0].Selected" type="checkbox">
Widget
<input name="products[1].Id" type="hidden" value="987">
<input name="products[1].Selected" type="checkbox">
Gadget

...および投稿を処理するコントローラーメソッド:

public ActionResult SelectProducts(IList<ProductSelection> products)
{
     ...
}

バインド時に、productsパラメーターにはProductSelectionの2つのインスタンスが含まれます。

注意点の1つは、複雑なオブジェクトに新しいデフォルトバインディングを使用していないことです。むしろ、両方ともMvcContribのNameValueDeserializerまたはCastleBindを使用しています。両方ともこのように動作します。ベータ版のバインディングも同じように機能すると思います。

データに応じて、 'CheckboxList'(新しいバージョンでは不可能)を出力し、 string [] パラメーターを使用するか、複数のフォームを設定できます。アクションを変更します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top