【问题标题】:Html.Grid containing checkbox per row每行包含复选框的 Html.Grid
【发布时间】:2010-08-23 08:21:42
【问题描述】:
我在我的 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 值。
谢谢:)
【问题讨论】:
标签:
asp.net-mvc-2
mvccontrib
mvccontrib-grid
【解决方案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 集合本身。
【解决方案2】:
我使用或多或少相同的网格代码进行此操作。
我定义的复选框列与您的大致相同:
column.For(x => Html.SimpleCheckBox("keys", x.Id.ToString())).DoNotEncode();
网格被包裹在一个表单中。
表单回传到下面的方法。
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Process(IList<int> keys) {
// do stuff with the keys
}
如果您将“Select”作为复选框名称,那么我猜参数名称也将是 Select。
【解决方案3】:
你可以这样添加
x.Add().Encoded(false).Sanitized(false).SetWidth(20).RenderValueAs(y => Html.Raw("
<input type='checkbox' value='"+y.IsAdmin+"' ) />"));
它将在每一行添加复选框。