2017-09-05 13 views
0

ユーザーとロールにViewModelを設定しようとしていますが、System.Data.Entity.DynamicProxies.AppUser.xxx(ユーザー用)やSystem.Dataなどのデータの代わりにタイプが表示されます。 Entity.DynamicProxies.IdentityRole.xxx(ロールの場合)DropDownListFor()内のデータの代わりにタイプを表示

コードは次のとおりです。上記のコード

public class AppUser : IdentityUser 
    { 
     //add custom properties which have not included in IdentityUser before 
     public string Designation { get; set; } 

     public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<AppUser> manager) 
     { 
      // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType 
      var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie); 
      // Add custom user claims here 
      return userIdentity; 
     } 

     public static ERPContext Create() 
     { 
      return new ERPContext(); 
     } 
    } 



public class AppRole : IdentityRole 
    { 
     public AppRole() : base() { } 
     public AppRole(string name) : base(name) { } 
     // extra properties here 
     public string Description { get; set; } 
    } 

のViewModel

public class UserAssignRoleViewModel 
    { 

     public string Username { get; set; } 

     public string Role { get; set; } 
     [Required] 
     public List<AppUser> Users { get; set; } 
     [Required] 
     public List<IdentityRole> Roles { get; set; } 

     public int SelectedId { set; get; } 

     public int SelectedRoleId { set; get; } 
    } 

RoleController

public ActionResult ManageUserRoles() 
     { 
      //this code is also an alternate way to fetch the roles from Owin // Startup config 
      // var roles = HttpContext.GetOwinContext().GetUserManager<RoleManager<IdentityRole>>().Roles; 
      //var rolelist = context.Roles.OrderBy(r => r.Name).ToList().Select(rr => new SelectListItem { Value = rr.Name.ToString(), Text = rr.Name }).ToList(); 
      var model = new UserAssignRoleViewModel(); 
      var users = context.Users.ToList(); 
      users.Select(s => new SelectListItem 
      { 
       Value = s.Id.ToString(), 
       Text = s.UserName.ToString() 
      }); 
      var roles = context.Roles.ToList(); 
      roles.Select(s => new SelectListItem 
      { 
       Value = s.Id.ToString(), 
       Text = s.Name.ToString() 
      }); 
      ViewBag.Users = users; 
      //var list = context.Roles.OrderBy(r => r.Name).ToList().Select(rr => new SelectListItem { Value = rr.Name.ToString(), Text = rr.Name }).ToList(); 
      //ViewBag.Roles = list; 
      model.Users = users; 
      model.Roles = roles; 
      return View(model); 
     } 

     [HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult RoleAddToUser(string UserName, string RoleName) 
     { 
      AppUser user = context.Users.Where(u => u.UserName.Equals(UserName, StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault(); 
      var userManager = new UserManager<AppUser>(new UserStore<AppUser>(context)); 

      userManager.AddToRole(user.Id, RoleName); 

      ViewBag.ResultMessage = "Role Assigned successfully !"; 

      // prepopulat users for the view dropdown 
      var _users = context.Users.OrderBy(r => r.UserName).ToList().Select(rr => new SelectListItem { Value = rr.UserName.ToString(), Text = rr.UserName }).ToList(); 
      ViewBag.Users = _users; 
      // prepopulat roles for the view dropdown 
      var _roles = context.Roles.OrderBy(r => r.Name).ToList().Select(rr => new SelectListItem { Value = rr.Name.ToString(), Text = rr.Name }).ToList(); 
      ViewBag.Roles = _roles; 

      return View("ManageUserRoles"); 
     } 

     [HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult GetRoles(string UserName) 
     { 
      if (!string.IsNullOrWhiteSpace(UserName)) 
      { 
       AppUser user = context.Users.Where(u => u.UserName.Equals(UserName, StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault(); 
       var userManager = new UserManager<AppUser>(new UserStore<AppUser>(context)); 

       ViewBag.RolesForThisUser = userManager.GetRoles(user.Id); 


       // prepopulat roles for the view dropdown 
       var list = context.Roles.OrderBy(r => r.Name).ToList().Select(rr => new SelectListItem { Value = rr.Name.ToString(), Text = rr.Name }).ToList(); 
       ViewBag.Roles = list; 
       // prepopulat roles for the view dropdown 
       var users = context.Users.OrderBy(r => r.UserName).ToList().Select(rr => new SelectListItem { Value = rr.UserName.ToString(), Text = rr.UserName }).ToList(); 
       ViewBag.Users = users; 
      } 

      return View("ManageUserRoles"); 
     } 

いくつかは、私が以前試したコードをコメントしています。 theDropdowns(必須検証が)を実装することができませんでしたため、私はそれが検証を除いて完璧に動作ViewBagを使用していたが

@model ERPLite.Models.UserAssignRoleViewModel 
@{ 
    ViewBag.Title = "ManageUserRoles"; 

} 

@Html.ActionLink("Create New Role", "Create") | @Html.ActionLink("Manage User Role", "ManageUserRoles") 
<hr /> 


@using (Html.BeginForm("RoleAddToUser", "Role")) 
{ 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary(true) 


    <p> 

     User Name: @Html.DropDownListFor(x => x.SelectedId, new SelectList(Model.Users), "Select") 
     @*Role Name: @Html.DropDownList("RoleName", (IEnumerable<SelectListItem>)ViewBag.Roles, "Select ...")*@ 
     Role Name: @Html.DropDownListFor(u => u.SelectedRoleId, new SelectList(Model.Roles), "Select ...") 
    </p> 

    <input type="submit" value="Save" /> 
} 
<hr /> 
<h3>Get Roles for a User</h3> 
@using (Html.BeginForm("GetRoles", "Role")) 
{ 
    @Html.AntiForgeryToken() 
    <p> 
     Username : @Html.TextBox("UserName") 
     <input type="submit" value="Get Roles for this User" /> 
    </p> 
} 

@if (ViewBag.RolesForThisUser != null) 
{ 
    <div style="background-color:yellow;"> 
     <h3>Roles for this user </h3> 
     <ol> 
      @foreach (string s in ViewBag.RolesForThisUser) 
      { 
       <li>@s</li> 
      } 
     </ol> 
    </div> 
} 

を次のように

最後に、図が必要な注釈とのViewModelとViewModelに採用し、されていますそのようなシナリオで推奨される方法。 助けてください。前もって感謝します 。 ID付きMVC 5、CodeFirst EFの使用。

+0

テスト値フィールド名のパラメータを取る 'SelectList'コンストラクタオーバーロードを使用してください。例えば'SelectResults(Model.Users、" id "、" Username ")' –

+0

'[必須]'を 'List Roles'に加えることは意味がありません。選択されたオプションを 'int SelectedRoleId'にバインドしますので、' [Required] '属性を必要とするそのプロパティー(それは' int? 'である必要があります) –

+0

@StephenMueckeありがとう。私がSelectedIdをドロップダウンバインドで使用すると、同じ権利を使用する必要がありますか? – user2695433

答えて

2

あなたのIDモデルはSelectListItemの代わりにビューモデルで使用しています。あなたのビューモデルチェンジで

[Required] 
    public List<AppUser> Users { get; set; } 
    [Required] 
    public List<IdentityRole> Roles { get; set; } 

public List<SelectListItem> Users { get; set; } 
    public List<SelectListItem> Roles { get; set; } 

へとSelectedIdSelectedRoleIdRequired属性を追加します。あなたのManageUserRolesアクションで

は何もしません。この

var roles = context.Roles.ToList(); 
     roles.Select(s => new SelectListItem 
     { 
      Value = s.Id.ToString(), 
      Text = s.Name.ToString() 
     }); 

ようSelect()を使用して、ところで

 model.Users = users.Select(s => new SelectListItem 
     { 
      Value = s.Id.ToString(), 
      Text = s.UserName.ToString() 
     }); 
     var roles = context.Roles.ToList(); 
     model.Roles = roles.Select(s => new SelectListItem 
     { 
      Value = s.Id.ToString(), 
      Text = s.Name.ToString() 
     }); 

にあなたのビューモデルの人口を変更します。変数にはSelectの結果を割り当てる必要があります。

+0

回答ありがとうございます。 SelectedListItemの代わりにList ユーザーを使用する方法はありますか? – user2695433

+0

@ user2695433、なぜあなたはそれをしたいでしょうか?そのビューモデルとビューモデルの目的は、正しいデータをビューに渡すことです。ビューには、 'List ' –

+0

'を削除する必要はなく、ドロップダウンリストに 'IEnumerable 'Required'属性を' Users'と 'Roles'プロパティの両方から取得します(そうでなければ、' ModelState'はPOSTメソッドで無効になります) –

関連する問題