2010-08-23 36 views
1

我在我的asp.net MVC2應用程序中使用Html.Grid。Html.Grid每行包含複選框

網格每行包含複選框。

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

我需要循環檢查記錄並對它們進行操作。如何在點擊按鈕時回發檢查的ID值。

謝謝:)

回答

0

我有這個工作或多或少相同的網格代碼。

複選框列我已經定義更多或更少的你的一樣:

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

網格被包裹在一種形式。

表單發回到以下方法。

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

如果您有「選擇」作爲複選框名稱,那麼我猜參數名稱也將是選擇。

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集合本身就做什麼用的項目列表做。