我正在尝试创建具有多个角色的用户这是我的新用户的viewModel
public class UserForNewViewModel
{
public RegisterViewModel User { get; set; }
public List<IdentityRole> Roles { get; set; }
}
这是我的行动
[HttpGet]
public async Task<ActionResult> Create()
{
var roles = await _context.Roles.ToListAsync();
var model = new UserForNewViewModel()
{
Roles = roles
};
return View(model);
}
在视图中我如何处理多角色
<div class="form-group">
<label>Roles</label>
???????????????????????????????????
@Html.DropDownListFor(x => x.Roles., new SelectList(Model.Roles, "Id", "Name"), ("Seçin..."), new { @class = "form-control", id = "ParentId" })
</div>
答案 0 :(得分:2)
我需要在用户创建阶段为特定用户添加多个用户角色。
所以我将使用前端的复选框来实现这一目标
所以这个视图
@model project_name.Models.RegisterViewModel
@{
}
@using (Html.BeginForm("Register", "Account", FormMethod.Post, new { @class = "form-horizontal"}))
{
<div class="form-group">
<label class="col-md-2 control-label">
Select User Role
</label>
<div class="col-md-10">
@foreach (var item in (SelectList)ViewBag.RoleId)
{
<input type="checkbox" name="SelectedRoles"
value="@item.Value" class="checkbox-inline" />
@Html.Label(item.Value, new { @class = "control-label" })
}
</div>
</div>
....
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" class="btn btn-default" value="Register" />
</div>
</div>
}
这些是我对AspNet Identity 2.0 framework
folder =&gt;中现有App_Start
所做的更改IdentityConfig.cs
档案
public class RoleManager<TRole> : RoleManager<TRole, string> where TRole : class, IRole<string>
{
//
// Summary:
// Constructor
//
// Parameters:
// store:
public RoleManager(IRoleStore<TRole, string> store);
}
public class ApplicationRoleManager : RoleManager<ApplicationRole>
{
public ApplicationRoleManager(
IRoleStore<ApplicationRole, string> roleStore)
: base(roleStore)
{
}
public static ApplicationRoleManager Create(
IdentityFactoryOptions<ApplicationRoleManager> options, IOwinContext context)
{
return new ApplicationRoleManager(
new RoleStore<ApplicationRole>(context.Get<ApplicationDbContext>()));
}
}
这些是我对AspNet Identity 2.0 framework
folder =&gt;中现有Models
所做的更改IdentityModels.cs
档案
public class ApplicationUser : IdentityUser
{
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(
UserManager<ApplicationUser> manager)
{
var userIdentity = await manager.CreateIdentityAsync(
this, DefaultAuthenticationTypes.ApplicationCookie);
return userIdentity;
}
}
public class ApplicationRole : IdentityRole
{
public ApplicationRole() : base() { }
public ApplicationRole(string name) : base(name) { }
public string Description { get; set; }
}
然后我按如下方式设置了控制器的寄存器方法
// POST: /Account/Register
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel model, HttpPostedFileBase upload, params string[] selectedRoles)
{
try
{
if (ModelState.IsValid)
{
var user = new ApplicationUser { UserName = model.UserName, Email = model.Email };
var result = await UserManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
//Add User to the selected Roles
if (selectedRoles != null)
{
var addroles = await UserManager.AddToRolesAsync(user.Id, selectedRoles);
if (!addroles.Succeeded)
{
ModelState.AddModelError("", result.Errors.First());
ViewBag.RoleId = new SelectList(await RoleManager.Roles.ToListAsync("Name", "Name"));
return View();
}
}
}
else
{
ModelState.AddModelError("", result.Errors.First());
ViewBag.RoleId = new SelectList(RoleManager.Roles, "Name", "Name");
return View();
}
return RedirectToAction("Index");
// AddErrors(result);
}
}
// If we got this far, something failed, redisplay form
catch (RetryLimitExceededException /* dex */)
{
//Log the error (uncomment dex variable name and add a line here to write a log.
ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists see your system administrator.");
}
ViewBag.RoleId = new SelectList(RoleManager.Roles, "Name", "Name");
return View(model);
}
但是存在'RoleManager'字的上述控制器的每一行我都得到编译时错误,如下所示
使用泛型类型'RoleManager TRole,TKey'需要2种类型 参数
这意味着我在上面的方法中遇到了3个编译时错误。
我也跟着this reference想法为aspnet idenity中的用户分配多个角色
修改强>
我刚刚更改了IdentityRole.cs[MetaData]
和IdentityUserRole[MetaData]
,如下所示
namespace Microsoft.AspNet.Identity.EntityFramework
{
//
// Summary:
// Represents a Role entity
public class IdentityRole : IdentityRole<string, IdentityUserRole>
{
//
// Summary:
// Constructor
public IdentityRole();
//
// Summary:
// Constructor
//
// Parameters:
// roleName:
public IdentityRole(string roleName);
}
public class IdentityRole<TKey, TUserRole> : IRole<TKey>
where TUserRole : IdentityUserRole<TKey>
{
public TKey Id
{
get
{
return JustDecompileGenerated_get_Id();
}
set
{
JustDecompileGenerated_set_Id(value);
}
}
public string Name
{
get;
set;
}
public ICollection<TUserRole> Users
{
get
{
return JustDecompileGenerated_get_Users();
}
set
{
JustDecompileGenerated_set_Users(value);
}
}
public IdentityRole()
{
this.Users = new List<TUserRole>();
}
}
public class IdentityUserRole<TKey>
{
public virtual TKey RoleId
{
get;
set;
}
public virtual TKey UserId
{
get;
set;
}
public IdentityUserRole()
{
}
}
}
答案 1 :(得分:0)
您可以使用复选框来执行此操作,例如
<div class="col-md-10">
@foreach (var item in (SelectList)ViewBag.RoleId)
{
<input type="checkbox" name="SelectedRoles"
value="@item.Value" class="checkbox-inline" />
@Html.Label(item.Value, new { @class = "control-label" })
}
</div>