2016-05-26 4 views
1

Я создаю компонент Роли/Разрешения для своего приложения. Моя точка зрения Роли модель выглядит следующим образом:DropDownListFor Composite Key со значением Столбец

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, Allow, Deny и сохраняет целочисленное значение в база данных.

Если я перехожу на страницу редактирования роли, я показываю список категорий разрешений, каждый из которых имеет список разрешений с соответствующими значениями (RolePermission) для каждого разрешения для этой роли. Как вы можете видеть, RolePermissionView имеет составные ключи (PermissionId, RoleId).

Как создать раскрывающийся список, который отображает список возможных значений разрешений и выбирает правильное значение разрешения для этого конкретного разрешения?

Следующее генерирует выпадающие списки, но не выбирает никаких значений. Кроме того, не дает каждому раскрывающемуся списку уникальное имя или идентификатор, поэтому привязка определенно не будет работать. Я предполагаю, что если позже переместить это в Шаблон редактора, у них будет уникальность.

@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> 
} 

Теперь выражение достаточно конкретизировано для привязки.

Кроме того, смените свой PermissionValues на IEnumerable<SelectListItem> вместо KeyValuePair. Тогда нет необходимости вручную создавать SelectList, что сэкономит вам много потенциальных головных болей. Чтобы построить Value из SelectListItem, я просто добавлю два составных идентификатора в виде строк (так как в любом случае значение должно быть строкой). Присоедините их к некоторому разделителю как запятую. Затем, на почте, вы можете получить опубликованное значение и разделить его на тот же разделитель, чтобы вернуть ваши два идентификатора. Очевидно, вам также понадобится преобразовать их обратно в int с. Вы можете опубликовать только одно значение из выбора, так что это действительно ваш единственный вариант, когда дело доходит до составных клавиш.

+0

Спасибо за ответ. Я смотрел на подобный подход. Следует отметить, что category.Permissions просто представляет собой список разрешений для определенной категории. Model.Permissions - это список PermissionRoles (составных клавиш) для роли. Таким образом, вышеизложенное не будет работать для меня. KeyValuePair был потому, что я генерировал более полезный список из перечисления. – getoutofmylaboratory

+0

Играется с этим немного и, по крайней мере, отображает значения, дает уникальные имена и выбирает выбранное значение (хотя мне пришлось заполнить третий параметр «objectSelected» в SelectList). На данный момент я назову это победой. – getoutofmylaboratory

Смежные вопросы