2012-03-13 47 views
1

在下面的截斷CSHTML摘錄我使用一個網格建立一個表:MvcContrib.Grid呈現額外的隱藏輸入列

@using (Html.BeginForm("DeleteSelected", "ControllerName", FormMethod.Post)) 
{ 
    @Html.Grid(Model).Columns(column => { 
     column 
      .For(x => x.CreationTime).Format("{0:g}"); 
     column 
      .For(x => x.OtherPropery); 
     column 
      .For(x => x.YetAnotherProperty); 
     column 
      .For(x => Html.CheckBox(x.IdThatICanUseToGrabModels, new {@class = "isSelectedCheck"})) 
      .Header(@<div><input type="checkbox" id="isSelectedHeader"/></div>); 
    }); 

當我通過表單POST提交我的網,我想是能夠確定哪些行被選中,並在我的控制器邏輯中相應地執行。最後的column.For(...)語句會創建一個複選框輸入和一個隱藏輸入。

顯然這是預期的行爲。由於兩個輸入具有相同的名稱,因此預期如何循環訪問FormCollection對象並獲取正確的值?每個密鑰(名爲x.IdThatICanUseToGrabModels)最終可能有多個值。

其他人怎麼能通過這個?

感謝,

布賴恩

回答

2

複選框/ CheckBoxFor助手旨在與您的視圖模型布爾性質。所以:

public class MyViewModel 
{ 
    public DateTime CreationTime { get; set; } 
    public string OtherProperty { get; set; } 
    public string YetAnotherProperty { get; set; } 
    public bool IdThatICanUseToGrabModels { get; set; } 
} 

然後:

@Html.Grid(Model).Columns(column => 
{ 
    column.For(x => x.CreationTime).Format("{0:g}"); 
    column.For(x => x.OtherProperty); 
    column.For(x => x.YetAnotherProperty); 
    column 
     .Custom(@<text>@Html.CheckBox("values", item.IdThatICanUseToGrabModels)</text>) 
     .Header(@<div><input type="checkbox" id="isSelectedHeader"/></div>); 
}) 

最後:

[HttpPost] 
public ActionResult DeleteSelected(bool[] values) 
{ 
    ... 
} 

你也可以有相應的布爾值隱藏標識(必須由以下組成的一對夫婦ID和一個布爾屬性,這將允許您在控制器操作中知道哪個ID被選中)。

+0

這看起來比我的解決方案更好,但我對你的'IdThatICanUseToGrabModels'屬性感到困惑。這應該是一個'獨立財產'布爾IsSelected''或我誤解了什麼? – 2012-03-13 19:32:35

0

所以現在我已經解決它像這樣:

column 
    .For(x => Html.Raw("<input name="+x.AMPExamNumber.ToString()+" type=\"checkbox\" />")) 
    .Header(@<div><input type="checkbox" id="isSelectedHeader"/></div>); 

然後我可以搶鍵值對從FormCollection對象使用它們來選擇從DB我的對象。

這看起來很糟糕。如果任何人有更好的解決方案,請發佈,以免我被迫將此標記爲解決方案...