2011-12-15 9 views
0

2010年の.net MVC3を使用してユーザーを管理する管理セクションを作成しようとしています。ユーザーと役割を別々に管理します。しかし、私は、新しいユーザーを作成したり編集したりするときに役割を追加する方法を理解するのに苦労しています。これは、私の知る限り得ているようです:個々のユーザーの役割をメンバーシップ情報とともに一覧表示、選択、編集するには

私のモデルでは:

public class UserModel 
{ 
    [Required] 
    [Display(Name = "User name")] 
    public string UserName { get; set; } 

    [Required] 
    [DataType(DataType.EmailAddress)] 
    [Display(Name = "Email address")] 
    public string Email { get; set; } 

    [Required] 
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)] 
    [DataType(DataType.Password)] 
    [Display(Name = "Password")] 
    public string Password { get; set; } 

    [DataType(DataType.Password)] 
    [Display(Name = "Confirm password")] 
    [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")] 
    public string ConfirmPassword { get; set; } 
} 
public class IndexViewModel 
{ 
    public IEnumerable<UserModel> Users { get; set; } 
    public IEnumerable<string> Roles { get; set; } 
} 
私のコントローラで

public ActionResult Index() 
{   
    return View(
     new IndexViewModel 
     { 
      Users = Membership.GetAllUsers().Cast<MembershipUser>().Select(x => new UserModel 
      { 
       UserName = x.UserName, 
       Email = x.Email, 
      }), 
      Roles = Roles.GetAllRoles() 
     }); 
} 

とビューで:

@model IEnumerable<BBmvc.Areas.Tools.Models.IndexViewModel> 
//... 
@foreach (var item in Model) { 
foreach (var user in item.Users) 
{ 
    <tr> 
    <td> 
     @Html.DisplayFor(modelItem => user.UserName) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => user.Email) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => user.Password) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => user.ConfirmPassword) 
    </td> 
    <td> 
     @Html.ActionLink("Edit", "Edit", new { /* id=user.PrimaryKey */ }) | 
     @Html.ActionLink("Details", "Details", new { /* id=user.PrimaryKey */ }) | 
     @Html.ActionLink("Delete", "Delete", new { /* id=user.PrimaryKey */ }) 
    </td> 
    </tr> 
} 
} 

私は見ていますこのエラー:

The model item passed into the dictionary is of type 'BBmvc.Areas.Tools.Models.IndexViewModel', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable

私は混乱しています。正しい軌道にいるのですか?今私は単にページに表示する役割を取得しようとしています...最終的には、ユーザーごとにフィルタリングする必要があるため、ユーザーの役割だけがリストされます。

編集: 以下の回答は、私が持っていたビューモデルの問題を修正しました。各ユーザーの役割を表示する究極のソリューションは、関与したものではありませんでした。

@foreach (var item in Model) { 
<tr> 
    <td> 
     @Html.DisplayFor(modelItem => item.UserName) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.Email) 
    </td> 
    <td> 
     @foreach (var role in item.UserRoles) 
     { 
      @role 
     } 
    </td> 
    <td> 
     @Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ }) | 
     @Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey */ }) | 
     @Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ }) 
    </td> 
</tr> 

}

おかげ:ビューで表示され、その後

 public ActionResult Index2() 
    { 
     var model = Membership.GetAllUsers().Cast<MembershipUser>().Select(x => new UserModel 
     { 
      UserName = x.UserName, 
      Email = x.Email, 
      UserRoles = Roles.GetRolesForUser(x.UserName) 
     }); 
     return View(model); 
    } 

そして:コントローラでそれを充填

public IEnumerable<string> UserRoles { get; set; } 

:私はUserModelにリストを追加しましたみんな!

+0

あなたのビューには「@モデル」とは何ですか? – DaveShaw

+0

@model IEnumerable Rob

答えて

0

IndexViewModelタイプのオブジェクトを1つ返すだけで、@model@model BBmvc.Areas.Tools.Models.IndexViewModelに変更する必要があります。

この単一のオブジェクトは、ユーザーとロールのリストを保持していると...あなたはビューを変更する必要があります。

@model BBmvc.Areas.Tools.Models.IndexViewModel 
//...  
@foreach (var user in Model.Users) 
{ 
      <tr> 
      <td> 
       @Html.DisplayFor(modelItem => user.UserName) 
      </td> 
      <td> 
       @Html.DisplayFor(modelItem => user.Email) 
      </td> 
      <td> 
       @Html.DisplayFor(modelItem => user.Password) 
      </td> 
      <td> 
       @foreach (var role in Model.Roles.Where(x => x.idUser == user.idUser)) 
       { 
        <span>@role.Name</span> | 
       } 
      </td> 
      <td> 
       @Html.ActionLink("ViewRoles", "View Roles", new { id=user.PrimaryKey }) | 
       @Html.ActionLink("Edit", "Edit", new { id=user.PrimaryKey }) | 
       @Html.ActionLink("Details", "Details", new { id=user.PrimaryKey }) | 
       @Html.ActionLink("Delete", "Delete", new { id=user.PrimaryKey }) 
      </td> 
      </tr> 
} 

この方法で、ユーザーの役割を持つことができ、かつ」をクリックしますロールを表示する "または" セットアップロール "(問題に最も適したリンクテキストを使用してください)、そのユーザーのロールの一覧を表示できます。ここでは、選択したユーザーのロールを追加/編集/削除できます。

+0

これははるかに優れています。ここから各ユーザーに固有の役割を表示するにはどうすればよいですか? – Rob

+0

@Robでは、ビューを表示してロールを表示し、別のリンクを '@Html.ActionLink( "ViewRoles"、 "ロールの表示"、新しい{id = user.PrimaryKey})'に配置できます。それ以外に、この表の他の '​​'にロールの要約を入れることができます。更新を参照してください。 – Romias

+0

私は実際にロールのリストをUserModelに追加しました: – Rob

0

あなたが変更する必要が@model

から:@model IEnumerable<BBmvc.Areas.Tools.Models.IndexViewModel>

へ:@model BBmvc.Areas.Tools.Models.IndexViewModel

コントローラのコードは、IndexViewModelの(つまり、コレクション/リスト/配列/任意)のインスタンスではなく、IndexViewModelのインスタンスを返しています。

関連する問題