2012-04-21 67 views
3

我有一個管理員網站爲管理員創建用戶。在這裏他必須爲用戶選擇角色 - 比如Asp.NET配置站點。我做了3個不同角色的複選框。在Asp.net MVC3中的多個角色

[Authorize(Roles = "Admin")] 
    [HttpPost] 
    public ActionResult Register(RegisterModel model) 
    { 
     if (ModelState.IsValid) 
     { 

      var Rolemodel = model.RolesContainer; 
      // Attempt to register the user 
      MembershipCreateStatus createStatus; 
      Membership.CreateUser(model.UserName, model.Password, model.Email, null, null, true, null, out createStatus); 
      if (createStatus == MembershipCreateStatus.Success) 
      { 
       FormsAuthentication.SetAuthCookie(model.UserName, false /* createPersistentCookie */); 
       return RedirectToAction("Index", "Home"); 
      } 
      else 
      { 
       ModelState.AddModelError("", ErrorCodeToString(createStatus)); 
      } 
     } 


     // If we got this far, something failed, redisplay form 
     return View(model); 
    } 


    [Authorize(Roles = "Admin")] 
    public ActionResult Register() 
    { 
     List<SelectListItem> tempRoles = new List<SelectListItem>(); 
     tempRoles.Add(new SelectListItem{ Text = "Admin", Selected = false, Value = "Admin" }); 
      tempRoles.Add(new SelectListItem{ Text = "Production", Selected = false, Value = "Production"}); 
       tempRoles.Add(new SelectListItem{ Text = "Sale", Selected = false, Value = "Sale"}); 

       return View(new RegisterModel { RolesContainer = tempRoles }); 
    } 

----查看--------

@{ foreach (var item in Model.RolesContainer) 
       { 
        @Html.DisplayFor(m => item.Text) 
        @Html.CheckBoxFor(m => item.Selected) 
       } 
      } 

當我檢查這些問題並提交,我可以在我的Register行動斷點,但RolesContainer是空的這一點 - 任何人都可以告訴我這是爲什麼?

+0

你可以顯示你的httpost方法的簽名嗎?我想你可能會期待一個類型參數不同於你傳入視圖的模型。 – Nope 2012-04-21 20:05:34

+0

我更新現在的代碼,所述點是當我到: 如果(ModelState.IsValid) { VAR =的RoleModel model.RolesContainer; } RolesContainer爲空,且不包含所選值 – Mrlondon7100 2012-04-21 21:52:36

回答

0

當前當您將值分配給RolesContainer時,它尚未初始化。你只需要初始化它在類的構造函數:

public class RegisterModel 
{ 
    public RegisterModel() { 
     RolesContainer = new List<SelectListItem>; 
    } 

    // rest of your code 
} 

另外,您可以創造出接受List<>作爲參數的構造函數,但上述方法會爲你當前的代碼結構工作。

+0

這不會解決問題。當CLR創建「RegisterModel」類時,「RolesContainer」將爲空,那麼將使用內聯代碼爲「RolesContainer」分配'tempRoles'的有效'List '來設置該屬性。 – 2012-04-21 20:43:38

+0

我在帖子中更新了我的帖子,並在評論中提供了準確的問題 – Mrlondon7100 2012-04-21 22:04:24

0

如果我理解的很好(可能是我完全錯了),您發佈到httppost寄存器(RegisterModel)的模型不包含您期望的RolesContainer。我認爲,asp.net mvc無法匹配多個複選框與List<SelectListItem>,一個列表框應該更好

+0

更新了我的帖子中的代碼,並提供了準確的問題,以便讓您更好地理解 – Mrlondon7100 2012-04-21 22:05:15

2

我複製並粘貼到下列文件中的代碼(除cshtml),並按預期工作。

HomeController.cs

using System.Collections.Generic; 
using System.Web.Mvc; 
using MvcApplication1.Models; 

namespace MvcApplication1.Controllers 
{ 
    public class HomeController : Controller 
    { 
     // 
     // GET: /Home/ 

     public ActionResult Index() 
     { 
      List<SelectListItem> tempRoles = new List<SelectListItem>(); 
      tempRoles.Add(new SelectListItem { Text = "Admin", 
               Selected = false, 
               Value = "Admin" }); 
      tempRoles.Add(new SelectListItem { Text = "Production", 
               Selected = false, 
               Value = "Production" }); 
      tempRoles.Add(new SelectListItem { Text = "Sale", 
               Selected = false, 
               Value = "Sale" }); 

      return View(new RegisterModel { RolesContainer = tempRoles }); 
     } 

    } 
} 

RegisterModel

using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.Web.Mvc; 

namespace MvcApplication1.Models 
{ 
    public class RegisterModel 
    { 
     [Required] 
     [Display(Name = "Brugernavn")] 
     public string UserName { get; set; } 

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

     public List<SelectListItem> RolesContainer { get; set;} 
    } 
} 

首頁/ Index.cshtml

@model MvcApplication1.Models.RegisterModel 

@{ 
    foreach (var item in Model.RolesContainer) 
    { 
     @Html.DisplayFor(m => item.Text) 
     @Html.CheckBoxFor(m => item.Selected) 
    } 
} 

摩斯你的Register.cshtml文件中可能有問題,我們不需要驗證。

+0

此帖子的操作是如何工作的?可以使用aspnet身份分配多個角色嗎? – kez 2016-03-07 11:11:38