Сделайте обязательные свойства класса не обязательными - PullRequest
0 голосов
/ 08 апреля 2011

У меня есть класс, настроенный для хранения значений в форме регистрации (VB.NET, MVC), и среди свойств есть свойство Password:

Public Class RegisterModel

    ...

    Private _password As String
    <DisplayName("Password:"), Required(), ValidatePasswordLength(), DataType(DataType.Password)> _
    Public Property Password() As String
        Get
            Return _password
        End Get
        Set(ByVal value As String)
            _password = value
        End Set
    End Property

Это прекрасно работает при регистрации нового пользователя, но я бы хотел использовать тот же класс для обновления существующих пользователей. (Примечание: это приложение запускается администратором, который отвечает за регистрацию физических лиц и назначение паролей.) Я бы хотел, чтобы он вел себя так: если администратор оставляет пароль пустым, тогда пароль не изменяется, а остальные информации есть. Если я использую этот класс, пароль не может быть пустым, так как он не срабатывает при вызовах Required () и ValidatePasswordLength ().

Есть ли способ использовать этот класс, но сказать модели игнорировать эти конкретные проверки? Даже если я оставлю поле пароля вне формы редактирования, оно все равно не будет выполнено. Нужно ли создавать целый дубликат класса без этих ограничений в поле пароля? Должен быть лучший способ.

Ответы [ 3 ]

2 голосов
/ 08 апреля 2011

Вы могли бы реализовать IDataErrorInfo и иметь флаг, установленный на модели, который указывает, используется ли он администратором или нет - вы могли бы затем проверить условно.

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

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

Я бы порекомендовал использовать библиотеку FluentValidation . Это фантастический способ отделить интересы вашего представления (модели представления) и фактической проверки, которую вы хотите выполнить. Вы можете передать параметры в него, чтобы управлять другим поведением. Проверьте Когда / Если условия или просто написание полностью пользовательских методов проверки с оператором Must .

public class RegisterModelValidator: AbstractValidator<RegisterModel>
{
  public RegisterModelValidator(bool isAdmin) 
    {
        RuleFor(x => x.Password).NotEmpty().Unless(isAdmin);
        ...
    }
}

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

0 голосов
/ 08 апреля 2011

Вы можете сделать это двумя способами:

1: добавить атрибут [ValidateInput (false)] к действию

или

2: добавление нового свойства в модель регистра

public bool IsNewUser {get;}

3: Создать новый атрибут уровня класса, который учитывает IsNewUser при проверке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...