2012-03-23 78 views
0

编辑:凡固定我的问题,使代码显示正确的,谢谢! :)检索在MVC3从强类型的视图动态复选框值和标签

我有一个愚蠢的问题,我真的需要帮助索姆,谷歌上搜索我接近失去我的头一整天后!

我用asp.net成员的工作,我希望能够在用户设定的角色,一旦web应用程序是UPP和运行。

为了实现这个我送了一个模型来一个强类型的视图与复选框列表,如果用户在复选框被选中在列表中的角色之一。 (这部分工作)

但我无法弄清楚如何编辑方法返回的复选框值,如在列表属性模型返回“零”。

我相信我已经错过了一些明显的这里,并且将是任何帮助非常高兴......

和我如何可以将代码添加到这个问题?我不能得到正确的格式...

查看

@model Mvc4m.Models.UserRoles 
@{ 
    ViewBag.Title = "Edit"; 
} 

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"> </script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 

@using (Html.BeginForm()) { 
@Html.ValidationSummary(true) 
<fieldset> 
    <legend>UserRoles</legend> 

    <div class="editor-label"> 
     <h2> @Html.DisplayFor(model => model.Name)</h2> 
    </div> 
    <div class="editor-label"> 
     @Html.LabelFor(model => model.Roles) 
    </div> 
    <div class="editor-field" id="testar"> 

    @foreach (var model in Model.AllRolles) 
    { 
     @Html.CheckBoxFor(item => model.IsActive, model.Role) 
     @Html.Label(model.Role) 
    } 

    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.IsApproved) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.IsApproved) 
     @Html.ValidationMessageFor(model => model.IsApproved) 
    </div> 

    <p> 
     <input type="submit" value="Save" /> 
    </p> 
</fieldset> 
} 

<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 

控制器

public List<AllRolles> UserActiveRoles(string name) 
{ 
    var list = new List<AllRolles>(); 

    foreach(var role in Roles.GetAllRoles()) 
    { 
     var hej = new AllRolles() 
         { 
          Role = role, 
          IsActive = Roles.IsUserInRole(name,role) 
         }; 
     list.Add(hej); 
    } 
    return list; 
} 

public ActionResult Index() 
{ 
    var roles = Roles.GetAllRoles(); 
    var users = from MembershipUser u in Membership.GetAllUsers() 
       select new UserRoles() 
       { 
        Name = u.UserName, 
        AllRolles = UserActiveRoles(u.UserName) 
       }; 
    return View(users); 
} 

public ActionResult Edit(string name) 
{ 
    var user = Membership.GetUser(name); 
    var model = new UserRoles() 
    { 
     Name = user.UserName, 
     AllRolles = UserActiveRoles(name) 
    }; 
    return View(model); 
} 

// 
// POST: /Admin/ManageUsers/Edit/5 

[HttpPost] 
public ActionResult Edit(UserRoles user) 
{ 
    var name = user.Name; 

    foreach (var role in user.AllRolles) 
    { 
     if (role.IsActive == true) 
      Roles.AddUserToRole(name,role.Role); 
     else 
      Roles.RemoveUserFromRole(name,role.Role); 
    } 

    return RedirectToAction("Index"); 
} 

模式

public class UserRoles 
{ 
    public string Name { get; set; } 

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

    public bool IsApproved { get; set; } 

    public List<AllRolles> AllRolles { get; set; } 

} 

namespace Mvc4m.Areas.Admin.Models 
{ 
    public class AllRolles 
    { 
     public string Role { get; set; } 
     public bool IsActive { get; set; } 
    } 
} 
+0

您可以通过4个空格缩进它格式化任何文本代码 - 有关更多详细信息,请参阅[help](http://stackoverflow.com/editing-help)。 – 2012-03-23 21:24:29

+0

而不是使用foreach可以使用for循环,并在您的CheckBoxFor使用Models.AllRoles [i] .IsActive。那样我就会相信在结果视图中输出AllRoles [0] .IsActive,然后在发布时正确绑定。 – dreza 2012-03-23 21:27:04

回答

0

在UserRoles.cs

变化

public List<AllRolles> AllRolles { get; set; } 

public AllRolles[] AllRolles { get; set; } 

在编辑。CSHTML

变化

@foreach (var model in Model.AllRolles) 
{ 
    @Html.CheckBoxFor(item => model.IsActive, model.Role) 
    @Html.Label(model.Role) 
} 

@for (int i = 0; i < Model.AllRolles.Length; i++) 
{ 
    @Html.CheckBoxFor(item => Model.AllRolles[i].IsActive) 
    @Html.HiddenFor(item => Model.AllRolles[i].Role) 
    @Html.Label(Model.AllRolles[i].Role) 
} 

在你的控制器

后添加.ToArray()UserActiveRoles(u.UserName)

public ActionResult Index() 
{ 
    var roles = Roles.GetAllRoles(); 
    var users = from MembershipUser u in Membership.GetAllUsers() 
      select new UserRoles() 
      { 
       Name = u.UserName, 
       AllRolles = UserActiveRoles(u.UserName).ToArray() 
      }; 
    return View(users); 
} 

问题

您必须出示给你发送一个集合,而不是一堆参数ModelBinder的。

什么发送到服务器?

AllRolles [0] .IsActive:假

AllRolles [0]。角色:管理员

AllRolles [1] .IsActive:假

AllRolles [1]。角色:用户

希望它可以帮助

+0

谢谢Kim!我决定用拖放来代替,但我喜欢你的解决方案,并且学到了新的东西:)我相信其他人也很感谢你的回答! – 2012-03-26 08:14:12

0

这是真实的简单。你必须给你的复选框一个名字,让我们说myCheckboxes,你传递一个int [] myCheckboxes到POST动作。我提供你一个代码示例:

在你看来,让我们说你有

@foreach (var role in Model.AllRoles) 
{ 
    <input type="checkbox" name="UserNotInRoles" value="@role.RoleId" checked/>@role.RoleName 
    <br /> 
} 

@foreach (var role in Model.UserRole) 
{ 
    <input type="checkbox" name="UserInRoles" value="@role.RoleId" checked/>@role.RoleName  
    <br /> 
} 

现在发布已经查了一下用户/选中您使用以下方法:

[HttpPost] 
public ActionResult Edit(UserRoleSaveVM saveRoles) 
{ 

    if (saveRoles.UserNotInRoles != null) 
    {     
    foreach (int roleID in saveRoles.UserNotInRoles) 
    { 
     //DO SOMETHING 

    } 
    } 

其中UserRoleSaveVM是

public class UserRoleSaveVM 
{ 
    public int UserID { get; set; } 
    public int[] UserInRoles { get; set; } //note that property name is the same as checkbox name 
    public int[] UserNotInRoles{ get; set; } //note that property name is the same as checkbox name 
} 
+0

这些属性是怎么来的? – 2012-03-23 22:21:51

+0

首先要知道的是,当一个复选框未被选中时,它不会被包含在POST集合中,所以你只会得到那些被选中的对象,并且得到一个用于检查的RoleId,你使用一个int数组int []来存储值。 – 2012-03-23 23:03:48

+0

我觉得@Kim Tranjan的回答更适合我的目的,但谢谢你的回答,并且时间:) – 2012-03-26 08:15:02