2

ビューにタイプ IEnumerable を渡し、アイテムごとに html.textbox を出力して詳細を入力します。

これをコントローラーに戻すと、コレクションが空になり、その理由がわかりません。

    public class Item
    {
        public Order Order { get; set; }
        public string Title { get; set; }
        public double Price { get; set; }
    }

私のGetメソッド:

public ActionResult AddItems(Order order)
    {
        Item itemOne = new Item
        {
            Order = order
        };

        Item itemTwo = new Item
        {
            Order = order,
        };

        IList<Item> items = new List<Item> { itemOne, itemTwo };

        return View(items);
    }

景色:

            <% int i = 0; foreach (var item in Model)
           { %>

            <p>
                <label for="Title">Item Title:</label>
                <%= Html.TextBox("items[" + i + "].Title") %>
                <%= Html.ValidationMessage("items[" + i + "].Title", "*")%>
            </p>
            <p>
                <label for="Price">Item Price:</label>
                <%= Html.TextBox("items[" + i + "].Price") %>
                <%= Html.ValidationMessage("items[" + i + "].Price", "*")%>
            </p>

        <% i++;
           } %>

POST メソッド:

 [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult AddItems(IEnumerable<Item> items)
    {
        try
        {

            return RedirectToAction("Index");
        }
        catch
        {
            return View();
        }
    }

現時点では、post メソッドにブレークポイントを設定して、何が返されるかを確認しています。

4

3 に答える 3

1

これを追加してみてください:

<input type="hidden" name="items.Index" value="<%=i%>" />

さらに遠く...

forループの実行方法を自由に変更して、コード内でインクリメントを行う必要がなくなるようにしました。これは、現在のアイテムを次のように呼び出すことを意味します。

<%= item.Current %>

そして、次のようにしてループの現在のインデックスにアクセスします。

<%= item.Index %>

したがって、ビューは次のようになります (ただし、現在のアイテムを使用しているようには見えませんが、そのインデックスのみです):

<% foreach(var item in Model.Select((x, i) => new { Current = x, Index = i }) { %>
  <p>
    <label for="Title">Item Title:</label>
    <input type="hidden" name="items.Index" value="<%= item.Index %>" />
    <%= Html.TextBox("items[" + item.Index + "].Title") %>
    <%= Html.ValidationMessage("items[" + item.Index + "].Title", "*")%>
  </p>
  <p>
    <label for="Price">Item Price:</label>
    <%= Html.TextBox("items[" + item.Index + "].Price") %>
    <%= Html.ValidationMessage("items[" + item.Index + "].Price", "*")%>
  </p>
<% } %>
于 2009-10-15T15:40:25.023 に答える
0

これが機能しない理由は、既定のモデル バインダーには、各フォーム要素を IEnumerable に配置する手がかりがないためです。

データを適切に配置するには、AddItems Post メソッドでモデルをデフォルト モデル バインダーのフォーム要素と一致させる必要があります。

または、フォーム変数を介して直接処理することもできます。

于 2009-10-15T13:18:29.490 に答える
0

複雑な型の配列は、作成を試みることができるバインダーなしで機能するかどうか疑問に思います。

Public ActionResult AddItems(Item[] items)
于 2009-10-15T13:21:42.463 に答える