2012-10-28 55 views
0

MVCContrib網格:ASP.NET MVC 4和MVCContrib電網:在複雜類型渲染複選框爲每個TR和郵政值

@model ViewModel 
@using (Html.BeginForm("SendData", "Home", FormMethod.Post)) 
{ 
    @Html.Grid(Model.List).Columns(c => 
    { 
     c.For(x => x.Id); 
     c.For(x => x.Name); 
     c.For(x =>Html.Partial("Partial/CheckBoxTemplate", new CheckBoxViewModel { Id = x.Id })).Named("Options"); 
    }) 

    @Html.SubmitButton() 
} 

控制器發佈操作:

public ActionResult SendData(List<CheckBoxViewModel> list) 
{ 
    return View(); 
} 

的ViewModels :

public class CheckBoxViewModel 
{ 
    public int Id { get; set; } 
    public bool CheckBox { get; set; } 
} 

public class ViewModel 
{ 
    public IPagination<Data> List { get; set; } 
} 

public class Data 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

管窺:

@model MvcApplication1.Models.CheckBoxViewModel 

@Html.HiddenFor(x => x.Id) 
@Html.CheckBoxFor(x => x.CheckBox) 

所有checkboxed默認情況下不進行檢查。

如何檢索我的SendData操作中的所有已選中的複選框值?

+0

'Partial/CheckBoxTemplate.cshtml'裏面有什麼?你也似乎綁定了一些'Name'屬性('c.For(x => x.Name);'),但是我看不到在你的'CheckBoxViewModel'中定義的這樣的屬性。你能不能展示你真實的代碼? –

+0

我更新了問題。 – Rookian

+0

但是你只傳遞'Id'給你的部分,你從來沒有設置布爾型的CheckBox屬性。你爲什麼不使用視圖模型?爲什麼你的'ViewModel'使用'IPagination '屬性而不是'IPagination '這會更有意義,因爲你試圖在視圖中生成複選框? –

回答

1

我建議你使用一個真實的視圖模型,它將反映你的視圖的要求(顯示一個包含每行一個複選框的網格,並顯示該項目的ID和名稱並在列表中檢索這些值回傳動作):

public class CheckBoxViewModel 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public bool CheckBox { get; set; } 
} 

public class ViewModel 
{ 
    public IPagination<CheckBoxViewModel> List { get; set; } 
} 

,然後讓你的視圖強類型此視圖模型:

@model ViewModel 

@using (Html.BeginForm("SendData", "Home", FormMethod.Post)) 
{ 
    @Html.Grid(Model.List).Columns(c => 
    { 
     c.For(x => x.Id); 
     c.For(x => x.Name); 
     c.For(x => Html.Partial("Partial/CheckBoxTemplate", x)).Named("Options"); 
    }) 

    <button type="submit">OK</button> 
} 

最後你的局部看起來是這樣的:

@model CheckBoxViewModel 

@{ 
    var index = Guid.NewGuid().ToString(); 
} 

@Html.Hidden("list.Index", index) 
@Html.Hidden("list[" + index + "].Id", Model.Id) 
@Html.Hidden("list[" + index + "].Name", Model.Name) 
@Html.CheckBox("list[" + index + "].CheckBox", Model.CheckBox) 

現在,當調用SendData動作時,它將傳遞視圖模型的列表。

另外,您可以使用在following article提出的Html.BeginCollectionItem幫手,這將允許您使用助手的強類型版本:

@model CheckBoxViewModel 
@using(Html.BeginCollectionItem("list")) 
{ 
    @Html.HiddenFor(x => x.Id) 
    @Html.HiddenFor(x => x.Name) 
    @Html.CheckBoxFor(x => x.CheckBox) 
} 

推薦進一步閱讀:Model Binding To A List

+0

有一件事讓我感到驚訝:爲什麼CheckBox創建一個額外的輸入隱藏字段? – Rookian

+1

因爲在HTML複選框中,如果未選中複選框,則不發送該值。因此,ChekBox助手添加了一個額外的隱藏字段,其硬編碼「false」值。這樣,如果沒有選擇複選框,則false將被綁定到視圖模型的布爾字段,如果複選框被選中,將會發送2個具有相同名稱的值:true和false,並且第一個值將被綁定。 –