2014-01-30 32 views
0

更新:解決方案是使用EditorTemplate。請參閱下面的解決方案:如何將模型中的對象列表傳遞迴控制器?

我想從一個控制器傳遞一個模型,讓我設置名稱,並將值設置爲未確定的角色(如複選框)。當我檢查回發時,我在模型中獲得了名稱的值,但角色爲空。我怎麼知道哪些複選框被選中?

型號:

public class MyModel 
{ 
    public string Name { get; set; } 
    public IEnumerable<RoleItem> Roles { get; set; } 
} 

public class RoleItem 
{ 
    public String Name { get; set; } 
    public String Id { get; set; } 
    public bool Selected { get; set; } 
    public RoleItem(String id, String name, bool selected = false) 
    { 
     this.Name = name; 
     this.Id = id; 
     this.Selected = selected; 
    } 
} 

剃刀:

@model WebApplication1.Controllers.MyModel 

@using (Html.BeginForm("Index", "Home", FormMethod.Post, new { @class = "form-horizontal", role = "form" })) 
{ 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary() 

    @Html.TextBoxFor(m=>m.Name) 

    foreach (var m in Model.Roles) 
    { 
     <div> 
      @Html.Label(m.Id, m.Name) 
      @Html.CheckBox(m.Id, m.Selected, new { id = @m.Id }) 
     </div> 
    } 
    <input type="submit"/> 
} 
+0

你應該有你的控制器 - >型號 - >查看<-Controller之間的通訊服務 – Mike

回答

0

目標:要允許任何管理員添加新用戶到ASP身份表,並指定他們在使用複選框列表中定義的角色。

型號:

public class RegisterViewModel 
{ 
    [Display(Name = "Name")] 
    public string FullName { get; set; } 

    [Required] 
    [DataType(DataType.Password)] 
    [Display(Name = "Password")] 
    public string Password { get; set; } 

    [DataType(DataType.Password)] 
    [Display(Name = "Confirm password")] 
    [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")] 
    public string ConfirmPassword { get; set; } 

    public List<RoleItem> Roles { get; set; } 

} 

public class RoleItem 
{ 
    public String Name { get; set; } 
    public String Id { get; set; } 
    public bool IsMember { get; set; } 
} 

控制器(GET):這讀取所有角色的數據庫,並將其轉變爲RoleItems的列表。這會在字段上加上字符「r」,因爲某些瀏覽器對於以數字開頭的id有問題。我們希望確保默認選中「用戶」組,因此我們在列表中找到該值並將IsMember屬性設置爲true。我們檢查,看看是否該頁面是從一個成功的POST重定向到這裏的要求(見下文)

// GET: /Account/AddUser 
    [Authorize(Roles = "Administrators")] 
    public ActionResult AddUser() 
    { 
     var rolesDb = new ApplicationDbContext(); //Users, Administrators, Developers, etc 
     ViewBag.AddSuccess = Request["added"]=="1" ? true : false; 

     var roleItems = rolesDb.Roles.Select(r => new RoleItem() { Id = "r" + r.Id, Name = r.Name, IsMember = false }).ToList(); //add an r to get around a browser bug 
     var users = roleItems.FirstOrDefault(r => r.Name == "Users"); //Get the row that has the Users value and set IsMember=true 
     if (users != null) 
      users.IsMember = true; 
     var m = new RegisterViewModel() {Roles = roleItems}; 
     return View(m); 
    } 

查看:漂亮的標準的東西。注意:@ Html.EditorFor(X => x.Roles)在底部,它使用一個編輯模板(如下)

@model cherry.Models.RegisterViewModel 
@{ 
    ViewBag.Title = "AddUser"; 
} 

<h2>@ViewBag.Title.</h2> 

@if (Convert.ToBoolean(ViewBag.AddSuccess)) 
{ 
    <text>User added!</text> 
} 

@using (Html.BeginForm("AddUser", "Account", FormMethod.Post, new { @class = "form-horizontal", role = "form" })) 
{ 
    @Html.AntiForgeryToken() 
    <h4>Create a new account.</h4> 
    <hr /> 
    @Html.ValidationSummary() 
    <div class="form-group"> 
     @Html.LabelFor(m => m.EmailAddress, new { @class = "col-md-2 control-label" }) 
     <div class="col-md-10"> 
      @Html.TextBoxFor(m => m.EmailAddress, new { @class = "form-control" }) 
     </div> 
    </div> 
    <div class="form-group"> 
     @Html.LabelFor(m => m.FullName, new { @class = "col-md-2 control-label" }) 
     <div class="col-md-10"> 
      @Html.TextBoxFor(m => m.FullName, new { @class = "form-control" }) 
     </div> 
    </div> 
    <div class="form-group"> 
     @Html.LabelFor(m => m.Password, new { @class = "col-md-2 control-label" }) 
     <div class="col-md-10"> 
      @Html.PasswordFor(m => m.Password, new { value = Model.Password, @class = "form-control" }) 
     </div> 
    </div> 
    <div class="form-group"> 
     @Html.LabelFor(m => m.ConfirmPassword, new {@class = "col-md-2 control-label" }) 
     <div class="col-md-10"> 
      @Html.PasswordFor(m => m.ConfirmPassword, new {value = Model.ConfirmPassword, @class = "form-control" }) 
     </div> 
    </div> 
    <div class="form-group"> 
     <div class="col-md-offset-2 col-md-10"> 
      <input type="submit" class="btn btn-default" value="Register" /> 
     </div> 
    </div> 

    @Html.EditorFor(x => x.Roles) 

} 

EditorTemplate:

MUST給模板相同的名稱作爲您爲其創建模板的對象。您還必須將此對象放在名爲EditorTemplates的文件夾下,您正在設計此視圖,或者可以將該文件夾放在共享文件夾中。

查看\帳戶\ EditorTemplates \ RoleItem.cshtml

@model cherry.Models.RoleItem 
<div> 
    @Html.CheckBoxFor(x => x.IsMember) 
    @Html.LabelFor(x => x.IsMember, Model.Name) 
    @Html.HiddenFor(x => x.Name) 
</div> 
相關問題