2011-01-27 35 views
9

我有一個類如下CheckBoxList的多重選擇:難度模型綁定背部

public class UserRoleModel 
{ 
    public string Role { get; set; } 
    public bool UserRole { get; set; } 
} 

public UserRoleModel[] UserRoles { get; set; }


我的控制器如下:

public ActionResult CreateUser() 
    { 
     UserDetailsModel model = new UserDetailsModel(); 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult CreateUser(UserDetailsModel model) 
    { 

     return View(model); 
    } 

在我看來,我有

>@foreach (var item in Model.UserRoles)  
    { 

    name = "UserRoles"+ ".Value["+ i + "]"; 
    id= "UserRoles" + "_Value[" + i++ + "]"; 
    selected = item.UserRole ? "checked=\"checked\"" : ""; 

     <p> 
     <input type="checkbox" name="@name" id="@id" @selected value="true" /> 
     <label for="@id">@item.Role</label> 
     <input type="hidden" name="@name" value="false" /> 
     </p> 
    } 

儘管在我的視圖中相應地顯示了值,但UserRoles沒有模型綁定。我錯過了什麼或有沒有更好更清潔的方法?

回答

21

這些類型的東西很好地與編輯器模板實現。他們也避免你在你的意見中寫意大利麪代碼。例如:

型號:

public class UserDetailsModel 
{ 
    public IEnumerable<UserRoleModel> Roles { get; set; } 
} 

public class UserRoleModel 
{ 
    public string Role { get; set; } 
    public bool UserRole { get; set; } 
} 

控制器:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(new UserDetailsModel 
     { 
      // Fill with some dummy stuff 
      Roles = Enumerable.Range(1, 5).Select(x => new UserRoleModel 
      { 
       Role = "role " + x, 
       UserRole = false 
      }) 
     }); 
    } 

    [HttpPost] 
    public ActionResult Index(UserDetailsModel model) 
    { 
     return View(model); 
    } 
} 

視圖(~/Views/Home/Index.cshtml):

@model AppName.Models.UserDetailsModel 
@using (Html.BeginForm()) 
{ 
    @Html.EditorFor(x => x.Roles) 
    <input type="submit" value="OK" /> 
} 

編輯器模板(~/Views/Home/EditorTemplates/UserRoleModel.cshtml):

@model AppName.Models.UserRoleModel 
@Html.CheckBoxFor(x => x.UserRole) 
@Html.LabelFor(x => x.Role, Model.Role) 
@Html.HiddenFor(x => x.Role) 

這就是我所說的乾淨的東西。

+0

有一件事我沒有注意到,直到我真的嘗試過它 - @ Html.EditorFor(x => x.Roles)實際上將遍歷集合。乾淨的確。 – chris 2012-03-13 16:51:24