カスタムModelBinderを確認することをお勧めします。
グリッドを使用していて、次のようなチェックボックス列があります。
column.For(x => Html.CheckBox(x.CatalogItemId + "-rcvd", false)).DoNotEncode().Named("Received");
ポストバックを処理するためのコントローラーのアクションシグネチャは次のとおりです。
[HttpPost]
public virtual ActionResult Index([ModelBinder(typeof(PendingRecievedItemsBinder))]IEnumerable<ShelfMyndr.Models.Previews.PendingReceivedCatalogItem> rcvdCatalogItems)
必要なのは、を実装するクラスだけですIModelBinder
。このBindModel
方法では、次のようなことができます。
foreach (string key in controllerContext.HttpContext.Request.Form.AllKeys.Where(k => controllerContext.HttpContext.Request[k].Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries).Length > 1))
{
if (key.EndsWith("-rcvd"))
{
ci.IsReceived = true;
}
これを使用すると、コントローラーのアクションは、Formsコレクション自体を反復処理するのではなく、アイテムのリストをどのように処理するかに焦点を当てることができます。