MVC 将用户角色返回到视图

MVC returning user roles to a view

我已使用以下教程 http://www.dotnetfunda.com/articles/show/2898/working-with-roles-in-aspnet-identity-for-mvc 向我的应用程序添加角色。我已经设法为存储在我的数据库中的用户添加了一个角色。但是我无法列出已分配给该用户的角色。我收到以下错误

对象引用未设置为对象的实例。

 get
 {
  return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
 }
    private set

我的控制器是这样的

 [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult GetRoles(string UserName)
    {
        ApplicationDbContext context = new ApplicationDbContext();
        if (!string.IsNullOrWhiteSpace(UserName))
        {
            ApplicationUser user = context.Users.Where(u => u.UserName.Equals(UserName, StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault();
            var account = new AccountController();
            //this.UserManager.GetRoles(user.Id);
            ViewBag.RolesForThisUser = account.UserManager.GetRoles(user.Id);

            // prepopulat roles for the view dropdown
            var list = context.Roles.OrderBy(r => r.Name).ToList().Select(rr => new SelectListItem { Value = rr.Name.ToString(), Text = rr.Name }).ToList();
            ViewBag.Roles = list;
        }

        return View("ManageUserRoles");
    }

和我的观点

<hr />
<h3>Get Roles for a User</h3>
 @using (Html.BeginForm("GetRoles", "Account"))
 {
   @Html.AntiForgeryToken()
   <p>
      Username : @Html.TextBox("UserName")
      <input type="submit" value="Get Roles for this User" />
   </p>
 }

@if (ViewBag.RolesForThisUser != null)
 {
  <div style="background-color:yellow;">
    <h3>Roles for this user </h3>
    <ol>
        @foreach (string s in ViewBag.RolesForThisUser)
        {
            <li>@s</li>
        }
    </ol>
</div>
} 

我认为你选择了一个糟糕的教程,如果你阅读了post末尾的评论,那么所有人都有类似的问题。顺便说一句,这篇文章很混乱。多次创建 AccountController 的实例以访问在该控制器 (UserManager) 上创建的对象的实例,永远将此实现直接绑定到默认 AccountController 的存在。

我留下几个好的教程

ASP.NET MVC 5 Identity: Extending and Modifying Roles

ASP.NET 身份 2.0:自定义用户和角色

Extending Identity Accounts and Implementing Role-Based Authentication in ASP.NET MVC 5

这听起来很熟悉,前几天我注意到了这个问题。我不会将其标记为完全重复的,因为我不完全确定它是..但是你和这个人很可能正在学习相同的教程。

编辑:经过进一步审查,它看起来像是完全相同的问题..所以我继续将其投票为重复。

你可以试试这个: 在您的控制器 class 中,插入:

using System.Threading.Tasks;
using Microsoft.AspNet.Identity.Owin;

接下来,控制器动作:

 [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> GetRoles(string UserName)
    {
        using (ApplicationDbContext context = new ApplicationDbContext())
        {
            if (!string.IsNullOrWhiteSpace(UserName))
            {

                ApplicationUser user = context.Users.Where(u => u.UserName.Equals(UserName, StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault();

                //var account = new AccountController();
                ApplicationUserManager UserManager = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
                //this.UserManager.GetRoles(user.Id);

                ViewBag.RolesForThisUser = await UserManager.GetRolesAsync(user.Id);
                // prepopulat roles for the view dropdown
                var list = context.Roles.OrderBy(r => r.Name).ToList().Select(rr => new SelectListItem { Value = rr.Name.ToString(), Text = rr.Name }).ToList();
                ViewBag.Roles = list;
            }

            return View("ManageUserRoles");
        }
    }

景色还行。如果对您有用,请告诉我。

感谢大家的回复。我已经通过使用以下内容设法 return 用户角色。

 [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult GetRoles(string UserName)
    {
        ApplicationDbContext context = new ApplicationDbContext();
        if (!string.IsNullOrWhiteSpace(UserName))
        {
            ApplicationUser user = context.Users.Where(u => u.UserName.Equals(UserName, StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault();

            var ReturnRole = this.UserManager.GetRoles(user.Id);
           // ViewBag.RolesForThisUser = account.UserManager.GetRoles(user.Id);
            ViewBag.RolesForThisUser = ReturnRole;
            // prepopulat roles for the view dropdown
            var list = context.Roles.OrderBy(r => r.Name).ToList().Select(rr => new SelectListItem { Value = rr.Name.ToString(), Text = rr.Name }).ToList();
            ViewBag.Roles = list;
        }

        return View("ManageUserRoles");
    }

以上来自 Stefan Vlad 的 Post 也可以使用 :) 谢谢 Stefan

我现在只需要删除一个用户的角色,希望如此!