2012-03-23 80 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