[私はこれを自分で解決しました。原因については私の回答を参照してください]
適切に設定されたコントローラー メソッドで IList<> 引数のフォーム値を取得するのに問題があります。
私のコントローラークラスは次のようになります。
public class ShoppingBasketController : Controller {
public ActionResult Index() {
return View();
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Add(IList<ShoppingBasketItem> items) {
Session["basket"] = items; // for testing
return RedirectToAction("Index");
}
}
public class ShoppingBasketItem {
public int ItemID;
public int ItemQuantity;
}
わずかにトリミングされたフォーム:
<% using (Html.BeginForm("Add", "ShoppingBasket")) { %>
<% int codeIndex = 0;
foreach (Product product in products) { %>
<%= Html.Hidden("items[" + codeIndex + "].ItemID", product.Id) %>
<%= Html.TextBox("items[" + codeIndex + "].ItemQuantity", "0", new { size = "2"}) %>
<% codeIndex++;
}
} %>
次のようなマークアップが生成されます。
<form action="/Basket/Add" method="post">
<input id="items[0]_ItemID" name="items[0].ItemID" type="hidden" value="1" />
<input id="items[0]_ItemQuantity" name="items[0].ItemQuantity" size="2" type="text" value="0" />
<input id="items[1]_ItemID" name="items[1].ItemID" type="hidden" value="2" />
<input id="items[1]_ItemQuantity" name="items[2].ItemQuantity" size="2" type="text" value="0" />
<input id="items[2]_ItemID" name="items[2].ItemID" type="hidden" value="3" />
<input id="items[2]_ItemQuantity" name="items[2].ItemQuantity" size="2" type="text" value="0" />
</form>
送信されたフォームの値を確認しましたが、正しい値です。sの正しい数ShoppingBasketItem
も ] に入れられますが、それぞれのとのSession["basket"
両方がゼロです。フォーム値のリストを正しくデコードしているように見えますが、プロパティ自体を取得していません。ItemID
ItemQuantity
私は MVC RC2 を使用しており、Scott Hanselman の記事に基づいて、私のコードが正しいと確信しています。何か不足していますか?