2017-03-09 68 views
0

我试图与一个以上的角色在这里创建的用户是我的新用户创建在asp.net身份不止一个角色的用户

public class UserForNewViewModel 
    { 
     public RegisterViewModel User { get; set; } 
     public List<IdentityRole> Roles { get; set; } 
    } 

这里的ViewModel是我的行动

[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> 

enter image description here

回答

2

我有要求在用户创建阶段为特定用户添加多个用户角色。

所以我要在前端实现这一目标使用复选框

所以这个的ViewPage

@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 frameworkApp_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 frameworkModels折叠ER =>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() 
    { 
    } 
} 
} 
+0

另一种选择是在发布时使用单个授权筛选器,但删除内部报价。 [Authorize(Roles =“members,admin”)] –

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> 
相关问题