所以我有一个后台,其中包含一个列出所有用户的页面和一个列出所有角色的页面。当我编辑用户时,我有一个下拉列表,其中包含图片中的所有角色。但我想确保每当我点击"更新"用户使用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;
}
}
}
答案 0 :(得分:0)
这取决于您当前界面的结构,但从您的示例看,您完全覆盖了用户和角色管理器的功能。
我的建议是:
<强> 1。图强>
您可以选择要将用户添加到的所有内容。当您点击保存/更新时,将整个ViewModel发布回控制器。此处不需要单独的Guid属性。
<强> 2。控制器强>
首先,我可以在这个例子中看到一些非常糟糕的做法。你在控制器中有你的数据库操作逻辑,我强烈建议你这样做。
尝试搜索以下主题:
在这方面,您可以在解决方案中以下列方式重组项目:
还有一个单独的模型或核心项目,它包含你需要随处可用的模型,扩展方法,如顺序guid等......有很多很好的例子,所以请尝试搜索一下。 / p>
我当前问题的例子如下:https://dotnetfiddle.net/izWNfm
我删除了样板代码以专注于您所遇到的问题,并且还可以通过某种形式的Dependancy Injection注入用户和角色管理器来改进此示例。