您可能想查看自定义 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 集合本身。