以下是我想要做的事情:我想在注册页面中将 AspNetUserRole 设置为新用户。
型号:
namespace MyProject.Models
{
public enum AccountRole
{
Responder = 10003, Sender= 10002, Admin = 10001
}
...
[Required()]
[Display(Name = "Account role")]
public AccountRole? AccountRole { get; set; }
查看:
@Html.LabelFor(model => model.AccountRole, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EnumDropDownListFor(model => model.AccountRole, htmlAttributes: new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.AccountRole, "", new { @class = "text-danger" })
</div>
注册页面结果: http://imgur.com/1lHL06L
控制器:
// POST: /Account/Register
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
var user = new ApplicationUser() { UserName = model.Email, Email = model.Email };
IdentityResult result = await UserManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
//User accountRole to AspNetUserRoles BY JULIUS
var accountRole = model.AccountRole;
await SignInAsync(user, isPersistent: false);
string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
var callbackUrl = Url.Action("ConfirmEmail", "Account",
new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
await UserManager.SendEmailAsync(user.Id,
"Confirm your account", "Please confirm your account by clicking <a href=\""
+ callbackUrl + "\">here</a>");
return RedirectToAction("Index", "Home");
}
else
{
AddErrors(result);
}
}
请将您的注意力转移到 AccountController.cs 注册部分。 我已成功收集了从下拉列表中输入的 AccountRole枚举:
var accountRole = model.AccountRole;
我想要做的是将accountRole
设置为我的实体框架 DefaultConnection
表: http://i.imgur.com/YBI3NSp.png
如何在我的Controller代码中解决这个问题?
答案 0 :(得分:4)
根据我的理解,您可能希望扩展IdentityUserRole
课程。
此类表示用户与其角色之间的关系。
public class AccountRole: IdentityUserRole<TKey>
{
public override TKey RoleId
{
get;
set;
}
public override TKey UserId
{
get;
set;
}
public IdentityUserRole()
{
}
public string somenewproperty(){
get; set;
}
}
然后我相信您必须覆盖createUserRole
中的userManager
或更具体的RoleManager
public class ApplicationRoleManager : RoleManager<IdentityRole> {
//...And so on
}
Check out this link for a full overview of the identity management
我真正得到的是为什么你想要首先做到这一点。
您可以向Roles
表添加新角色,并将该角色与某些规则联系起来,在这种情况下,您只需使用内置RoleManager
为用户分配角色。
await userManager.AddToRoleAsync(userId, AccountRole.Admin);
在这种情况下,您的AccountRole
将是Enum
public enum AccountRole {
Admin,
User
}
为了使这项工作成功,您必须将角色添加到数据库中,如下所示:
context.Roles.Add(new IdentityRole("SomeRoleNameHere"));
最好在Seed方法中完成;
然后你有了注册方法:
[Route("Register")]
public async Task<IHttpActionResult> Register(RegisterBindingModel model)
{
//Do the register of the user
//Next:
await UserManager.AddToRoleAsync(userId, AccountRole.Admin);
}
这会将用户添加到&#34; Admin&#34;如果添加正确。 现在,如果您查看数据库,AspNetUserRoles将使您的UserId和RoleId相互匹配。
如果你不能让它工作,你也可以创建一个静态类,我在之前的项目中做了这个。 它的工作方式与#34;角色名称相同。对象看起来像这样:
public static class RoleNames {
public const string Supervisor = "Supervisor";
public const string Administrator = "Administrator";
}
所有其他的东西 - 比如在种子方法中将它们添加到数据库中等等都是完全相同的。 并将其添加到用户:
await userManager.AddToRoleAsync(UserId, RoleNames.Supervisor);