Предотвратить автоматическую установку свойства, если пользовательская роль не является администратором? - PullRequest
1 голос
/ 26 апреля 2011

У меня есть класс модели со свойством AreDuesPaid, которое я хочу, чтобы только администраторы могли видеть и редактировать.

Класс выглядит примерно так:

public class ClubMember
{
    [ScaffoldColumn(false)]
    public int Id { get; set; }

    [Display(Name = "First Name")]
    [Required(ErrorMessage = "First name is required")]
    public string FirstName { get; set; }

    [Display(Name = "Last Name")]
    [Required(ErrorMessage = "Last name is required")]
    public string LastName { get; set; }

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

    [DataType(DataType.PhoneNumber)]
    [Display(Name = "Phone Number")]
    public string PhoneNumber { get; set; }

    [Authorize(Roles="Administrator")] // error: this can only be used for methods
    public bool AreDuesPaid{ get; set; }
}

Я подумал, может быть, я мог бы использовать атрибут Authorize, но компилятор говорит мне, что это только для методов.

Итак, мне интересно, как я могу ограничить доступ к определенному свойству при использовании DisplayForModel()и EditorForModel() для автоматических видов лесов?

Нужно ли создавать полностью отдельные виды и модели видов или есть более простой способ?

Ответы [ 2 ]

1 голос
/ 02 мая 2011

Вот решение, в котором я остановился:

  1. Использование моделей просмотра вместо моделей. Итак, в этом случае я создал класс с именем ViewModels.ClubMember.EditorModel.
  2. Для любых свойств, предназначенных только для администратора, поместите их в отдельный класс. В этом случае ViewModels.ClubMember.AdminEditorModel
  3. Сделать AdminEditorModel свойством EditorModel.
  4. При запросе EditorModel служба, которая получает модель, проверяет учетные данные вошедшего в систему пользователя. Если пользователь является администратором, свойство AdminEditorModel заполняется, в противном случае оно устанавливается равным нулю.
  5. В представлении используйте EditorForModel() для визуализации EditorModel, затем, если AdminEditorModel не равно NULL, используйте EditorFor (model => model.AdminEditorModel), чтобы скомпоновать оставшиеся свойства. (Примечание: AdminEditorModel не будет автоматически скаффолдинг при выполнении EditorForModel(), потому что шаблон object по умолчанию специально игнорирует сложные свойства.)

Это заняло определенную работу, но пока я нахожу это довольно чистым решением. Похоже, с валидацией это тоже хорошо работает.

Обновление

Основываясь на некоторых комментариях к ответу ebb (особенно на Дэнни), я решил немного улучшить ситуацию, используя совершенно разные страницы для администраторов и обычных пользователей. Каждая страница получает свою собственную модель просмотра (EditorModel и AdminEditorModel). Это заняло еще больше работы, чем мое первоначальное решение (мне пришлось добавить новые действия в мой контроллер и добавить сопоставления между моделями представления и моделями, но конечный результат - еще один очиститель уровня и определенно более безопасный.

1 голос
/ 26 апреля 2011

Не имеет смысла устанавливать ограничения на доступ к свойствам. Вместо этого вам следует проверить, входит ли пользователь, вошедший в систему, в роль «Администратор» при отображении представления (составьте несколько операторов if в представлении, поэтому, если пользователь находится в роли «Администратор», отобразите значение AreDuesPaid, еще спрячусь)

...