2012-04-21 40 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