【问题标题】:Multiple roles in Asp.net MVC3Asp.net MVC3 中的多个角色
【发布时间】:2012-05-02 23:48:10
【问题描述】:

我有一个管理员站点供管理员创建用户。在这里,他必须为用户选择角色——比如 Asp.NET 配置站点。我做了 3 个不同角色的复选框。

[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 为空 - 谁能告诉我这是为什么?

【问题讨论】:

  • 你能显示你的httpost方法的签名吗?我认为您可能期望一个与您传递到视图中的模型不同类型的参数。
  • 我现在更新了代码,关键是当我到达: if (ModelState.IsValid) { var Rolemodel = model.RolesContainer; } RolesContainer 为空,不包含所选值

标签: asp.net-mvc-3 role


【解决方案1】:

我将您的代码(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 });
        }

    }
}

注册模型

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;}
    }
}

Home/Index.cshtml

@model MvcApplication1.Models.RegisterModel

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

您的 Register.cshtml 文件中很可能有问题,我们无需对其进行验证。

【讨论】:

  • 这个帖子操作是如何工作的?一个人可以在 aspnet 身份中分配多个角色吗?
【解决方案2】:

当前,当您将值分配给RolesContainer 时,它尚未初始化。你只需要在你的类的构造函数中初始化它:

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

    // rest of your code
}

或者,您可以创建一个接受List&lt;&gt; 作为参数的构造函数,但上述方法适用于您当前的代码结构。

【讨论】:

  • 这不会解决问题。当 CLR 创建 RegisterModel 类时,RolesContainer 将为 null,然后使用内联代码设置属性,为 RolesContainer 分配有效的 List&lt;SelectListItem&gt;tempRoles
  • 我在帖子中更新了我的代码,评论中有准确的问题
【解决方案3】:

如果我理解得很好(可能我完全错了),您发布到 httppost 寄存器 (RegisterModel) 的模型不包含您期望的 RolesContainer。我认为,asp.net mvc 无法将多个复选框与List&lt;SelectListItem&gt; 匹配,ListBox 应该更好

【讨论】:

  • 用准确的问题更新了我在帖子中的代码,以便更好地理解
猜你喜欢
  • 2012-02-17
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
  • 2013-03-31
  • 2012-10-25
  • 1970-01-01
相关资源
最近更新 更多