从后台的下拉列表中将用户分配给角色

时间:2016-12-15 12:50:21

标签: c# asp.net asp.net-mvc asp.net-core asp.net-identity

所以我有一个后台,其中包含一个列出所有用户的页面和一个列出所有角色的页面。当我编辑用户时,我有一个下拉列表,其中包含图片中的所有角色。但我想确保每当我点击"更新"用户使用AspNetUserRole表连接到该特定角色。我不知道如何做到这一点:/ Id都是Guid Id。

这是我的UserController.cs:

namespace Overnight.WWW.Areas.Backoffice.Controllers 
    {
        [Area("Backoffice")]
        public class UserController : BaseController 
        {
            private readonly UserManager<ApplicationUser> _userManager;
            private readonly RoleManager<ApplicationRole> _roleManager;
            public UserController(ApplicationDbContext applicationDbContext, UserManager<ApplicationUser> userManager, RoleManager<ApplicationRole> roleManager):base(applicationDbContext)
            {
                _userManager = userManager;
                _roleManager = roleManager;

            }

            public async Task<IActionResult> Index(string sortParam, string searchString) 
            {

                var model = await ApplicationDbContext.Users.OrderBy(o => o.Email).ToListAsync();

                if (this.Request.Headers["X-Requested-With"] == "XMLHttpRequest") 
                {
                    return PartialView("_ListPartial", model);
                }

                return View(model);
            }


            [HttpGet]
            public async Task<IActionResult> Edit(Guid id)
            {
                if (id == null)
                {
                    return new StatusCodeResult(400);
                }

                var model = await ApplicationDbContext.Users.FirstOrDefaultAsync(m => m.Id == id);

                if(model == null)
                {
                    return RedirectToAction("Index");
                }

                 var viewModel = await ViewModel(model);

                return View(viewModel);
            }

            [HttpPost]
            [ValidateAntiForgeryToken]
            public async Task<IActionResult> Edit(UserViewModel model, Guid id)
            {
                var alert = new Alert();

                try 
                {
                    if(!ModelState.IsValid)
                    {
                        alert.Message = alert.ExceptionMessage = ApplicationDbContextMessage.INVALID;
                        throw new Exception();
                    }    


                    var originalModel = ApplicationDbContext.Users.FirstOrDefault(m => m.Id == id);


                    if(originalModel == null) 
                    {
                        alert.Message = alert.ExceptionMessage = ApplicationDbContextMessage.NOTEXISTS;
                        throw new Exception();
                    }


                    originalModel.Email = model.ApplicationUser.Email;

                    ApplicationDbContext.Users.Attach(originalModel);


                    ApplicationDbContext.Entry(originalModel).State = EntityState.Modified;

                    if (await ApplicationDbContext.SaveChangesAsync() == 0)
                    {
                        alert.Message = alert.ExceptionMessage = ApplicationDbContextMessage.EDITNOK;
                        throw new Exception();
                    } 

                    alert.Message = ApplicationDbContextMessage.EDITOK;
                    return RedirectToAction("Index");
                }
                catch(Exception ex)
                {
                    alert.Type = AlertType.Error;
                    alert.ExceptionMessage = ex.Message;

                    model = await ViewModel(model.ApplicationUser);

                    ModelState.AddModelError(string.Empty, alert.ExceptionMessage);
                }
                return View(model);
            }



       private async Task<UserViewModel> ViewModel(ApplicationUser user = null) 
            {
                var roles = await ApplicationDbContext.Roles.Select(o => new SelectListItem { 
                    Value = o.Id.ToString(), 
                    Text = o.Name
                }).ToListAsync();

                var viewModel = new UserViewModel
                {
                    ApplicationUser = (user != null)?user:new ApplicationUser(),
                    Roles = roles,                
                };

                return viewModel;
            }  

        }
    }

1 个答案:

答案 0 :(得分:0)

这取决于您当前界面的结构,但从您的示例看,您完全覆盖了用户和角色管理器的功能。

我的建议是:

<强> 1。图

  • 在编辑GET操作上有一个多选下拉列表,其中列出了该用户不是其成员的所有角色(在控制器上将这些角色过滤掉,然后将列表返回到视图中)。

您可以选择要将用户添加到的所有内容。当您点击保存/更新时,将整个ViewModel发布回控制器。此处不需要单独的Guid属性。

<强> 2。控制器

首先,我可以在这个例子中看到一些非常糟糕的做法。你在控制器中有你的数据库操作逻辑,我强烈建议你这样做。

尝试搜索以下主题:

  • 多层架构
  • 服务/存储库模式

在这方面,您可以在解决方案中以下列方式重组项目:

  1. Web(Web应用程序项目包含控制器,视图,视图模型和应用程序启动逻辑)
  2. 服务(您的业务逻辑)
  3. 存储库(您的数据库访问逻辑)
  4. DAL(或数据 - 这是数据库模型的位置,数据库上下文,迁移,数据库连接字符串...)
  5. 还有一个单独的模型或核心项目,它包含你需要随处可用的模型,扩展方法,如顺序guid等......有很多很好的例子,所以请尝试搜索一下。 / p>

    我当前问题的例子如下:https://dotnetfiddle.net/izWNfm

    我删除了样板代码以专注于您所遇到的问题,并且还可以通过某种形式的Dependancy Injection注入用户和角色管理器来改进此示例。