1
@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <div id="elem">
        <div class="fields">
            <select name="items[1][0]" id="items[1][0]">
            <option value="1">Book</option>
            <option value="2">Brush</option>
            </select>&nbsp;&nbsp;
            <input type="text" value="1" name="items[1][1]" id="items[1][1]">&nbsp;&nbsp;
            <a id="test" href="#">Remove Item</a>
        </div>
    </div>       
    </div><a href="#" id="addElem">Add Item</a></div>
    <br />
    <input type="submit" name="name" value="Submit" />
}

基本的に、名前フィールドとシリアル フィールドの 2 つのフィールドのセットがありますが、2 次元配列で定義されています。このリンクは、ユーザーがクリックすると、 JavaScript を使用しAdd Itemて現在の時間である ID を持つ新しいフィールド セットを追加するように機能します。var new_id = new Date().getTime();たとえば、新しいフィールドのセットは次のようになります。

<div class="fields">
<select name="items[1368034980308][0]" id="items[1368034980308][0]">
<option value="1">Book</option>
<option value="2">Brush</option>
</select>

<input type="text" name="items[1368034980308][1]" id="softwarePerAsset[1368034980308][1]">
</div>

items編集アクションが配列を通過し、2 つのフィールドを追加する編集アクションにそれらを送信したいと思います。

私の編集アクションは次のようになります。

[HttpPost]
public ActionResult Edit(FormCollection col, string[,] items)
{
    return View();
}

このアクションにブレーク ポイントを設定しましたが、配列が空で、変数itemsを介してしかフィールドにアクセスできません。FormCollection col

items配列が正しく設定されていないために欠けているものはありますか。

4

1 に答える 1

0

救出に向かうJson。このブログ ( http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx ) のアイデア、特にノンシーケンシャルのセクションを使用して、フォームを次のように再設計しました。タイムスタンプを使用して追加しているインデックス:

<div class="fields">
 <input type="hidden" name="items.Index" value="1" />
 <select name="items[1].name" id="items[1].name">
  <option value="1">Visio</option>
  <option value="2">Painter</option>
 </select>&nbsp;&nbsp;
 <input type="text" name="items[1].serial" id="items[1].serial" />&nbsp;&nbsp;
 <a id="test" href="#">Remove Item</a>
</div>

次に、コントローラーで FormCollection 変数を json にシリアル化します。これにより、操作がはるかに簡単になります。

[HttpPost]
public ActionResult Edit(FormCollection col)
{
 string json = JSONHelper.ToJSON(col);
 return View();
}

文字列の例は次のjsonようになります。

{ "btnSubmit" : "Submit",
  "items.Index" : "1,2,1368212161686,1368212162374,1368212162966,1368212163750",
  "items[1368212161686].name" : "1",
  "items[1368212161686].serial" : "",
  "items[1368212162374].name" : "2",
  "items[1368212162374].serial" : "",
  "items[1368212162966].name" : "1",
  "items[1368212162966].serial" : "98765",
  "items[1368212163750].name" : "2",
  "items[1368212163750].serial" : "43210",
  "items[1].name" : "1",
  "items[1].serial" : "12345",
  "items[2].name" : "2",
  "items[2].serial" : "67890"
}

値を取得できるようにするには、ToJSON 拡張機能を作成する必要がありました。そうしないと、名前だけが取得されました。

public static class JSONHelper
    {
        public static string ToJSON(this System.Web.Mvc.FormCollection collection)
        {
            var list = new Dictionary<string, string>();
            foreach (string key in collection.Keys)
            {
                list.Add(key, collection[key]);
            }
            return new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(list);
        }
    }
于 2013-05-10T19:16:03.237 に答える