每行包含Html.Grid复选框

时间:2010-08-23 08:21:43

标签: asp.net-mvc-2 mvccontrib mvccontrib-grid

我在我的asp.net MVC2应用程序中使用Html.Grid。

网格包含每行的复选框。

<%= Html.Grid<MyViewModel>(Model.MyList)
        .Columns( column => {
            column.For(x => Html.CheckBox("Select", false, new { id = x.ID })).DoNotEncode();

我需要遍历已检查的记录并对其进行操作。如何在单击按钮上进行回发时,如何检索已检查的id值。

谢谢:)

3 个答案:

答案 0 :(得分:1)

您可能想要查看自定义的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集合本身进行迭代。

答案 1 :(得分:0)

我使用或多或少相同的网格代码。

我定义的Checkbox列与您的定义大致相同:

column.For(x => Html.SimpleCheckBox("keys", x.Id.ToString())).DoNotEncode();

网格包裹在一个表单中。

表单会回复以下方法。

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Process(IList<int> keys) {
// do stuff with the keys
}

如果您有“选择”作为复选框名称,那么我猜参数名称也将是选择。

答案 2 :(得分:0)

你可以这样添加

 - { path: ^/admin/select-customer-status, roles: ROLE_EXTENDED_ADMIN }

它会在每一行添加复选框。