2016-05-26 2 views
1

私のアプリケーションのロール/パーミッションコンポーネントを構築しています。マイ・ロール・ビュー・モデルは、次のようになりますDropDownListFor値の列を持つコンポジットキー

public class RoleView 
{ 
    public int Id { get; set; } 

    public ApplicationWithPermissionsView Application { get; set; } 

    public List<RolePermissionView> Permissions { get; set; } 

    public IEnumerable<KeyValuePair<string, int>> PermissionValues 
    { 
     get 
     { 
      return EnumHelper.ToList<PermissionValue>(); 
     } 
    } 

    [Required] 
    public string Name { get; set; } 
} 

RolePermissionにビューモデルは次のようになります。

public class RolePermissionView 
{ 
    public int PermissionId { get; set; } 

    public int RoleId { get; set; } 

    public PermissionValue Value { get; set; } 
} 

PermissionValueはNOTSETは、許可、拒否のメンバーを持つ列挙型である、としてint型の値を格納しますデータベース。

ロール編集ページに移動すると、権限のリストが表示され、そのロールの権限ごとにそれぞれの値(RolePermission)が表示されます。ご覧のとおり、RolePermissionViewには複合キー(PermissionId、RoleId)があります。

可能な権限値のリストを表示し、その権限に適した権限値を選択するドロップダウンリストを作成するにはどうすればよいですか?

次はドロップダウンリストを生成しますが、値は選択しません。また、各ドロップダウンリストに一意の名前やIDを指定するわけではないので、バインディングは確実に機能しません。後でこれをエディタテンプレートに移すと、ユニークなものになると思います。

@foreach (var permission in category.Permissions) 
{    
<tr>       
    <td>@permission.Description</td>       
    <td>@Html.DropDownListFor(m => m.Permissions.Find(p => p.PermissionId == permission.Id).PermissionValue, new SelectList(Model.PermissionValues, "Value", "Key"))</td> 
</tr>    
} 

答えて

0

ここでのトラブルはほとんど構文的です。 DropDownListForやその他の*Forスタイルのヘルパーの場合は、という式をリテラルインスタンスではなく渡していることに注意してください。ヘルパーは、その式を解析して、データがポストバックされたときに(うまくいけば)バインドする名前属性値を入力に作成しようとします。明らかに、Findのようなことをするのは、それを翻訳する方法がないので、同じことが投稿後にもう一方の側で起こるので、うまくいきません。代わりに、あなたは次のようなことをする必要があります:

@for (var i = 0; i < category.Permissions.Count(); i++) 
{ 
    <tr>       
     <td>@category.Permissions[i].Description</td>       
     <td>@Html.DropDownListFor(m => category.Permissions[i].PermissionValue, Model.PermissionValues)</td> 
    </tr> 
} 

今、表現はバインドするのに十分です。

さらにKeyValuePairの代わりにPermissionValuesプロパティをIEnumerable<SelectListItem>に変更してください。その後、手作業でSelectListを作成する必要はありません。これにより、多くの頭痛を緩和します。 のValueを構築するには、2つのコンポジットIDを文字列として追加するだけです(値は文字列でなければならないため)。カンマのような区切り記号で結合してください。次に、投稿時に、投稿された値を取得し、同じデリミタで分割して2つのIDを返すことができます。明らかに、それらを両方ともintに変換する必要があります。あなたはselectから1つの値を返すことしかできないので、複合キーについてはこれがあなたの唯一の選択肢です。

+0

返信いただきありがとうございます。私はこれに似たアプローチを検討していました。注目すべきは、category.Permissionsは単に特定のカテゴリのパーミッションのリストです。 Model.PermissionsはロールのPermissionRoles(複合キー)のリストです。だから、上記は私のためにはうまくいかないでしょう。 KeyValuePairはenumからより使いやすいリストを生成していたためです。 – getoutofmylaboratory

+0

これでちょっと遊び、少なくとも値を表示し、一意の名前をつけ、選択した値を選択します(ただし、SelectListの3番目のパラメータ "objectSelected"を設定しなければなりませんでした)。私は今これを勝利と呼ぶでしょう。 – getoutofmylaboratory

関連する問題