Проверка модели и свойств, когда текущие значения недействительны - PullRequest
1 голос
/ 27 января 2012

Что было бы лучшим способом реализовать проверку в ASP.NET MVC 3, когда она должна быть запущена только , если пользователь изменил значение. Он не должен срабатывать, если текущее значение недопустимо, но пользователь не изменил его. Например

public class SomeViewModel
{
    [Required]
    [Range(10, 20)]
    public int? SomeProperty { get; set; }

    public int? AnotherProperty { get; set; }
}

Если пользователь вводит значение вне диапазона 10 и 20, проверки ASP.NET MVC по умолчанию запускаются как на сервере, так и на клиенте (ненавязчиво). Однако, если текущее значение SomeProperty недопустимо (скажем, 25), но пользователь только изменяет значение AnotherProperty, проверка для SomeProperty по-прежнему запускается как на сервере, так и на клиенте. Как реализовать проверку, которая допускает существующее недопустимое значение для данного свойства, только если оно не изменено пользователем. Таким образом, в этом случае, если SomeProperty имеет значение 25 (что недопустимо), а пользователь только изменяет значение AnotherProperty, проверка не должна запускаться. Если пользователь изменяет значение SomeProperty на значение, отличное от 25 (текущее значение), оно должно быть проверено и недопустимые значения не допускаются.

1 Ответ

0 голосов
/ 27 января 2012

хорошо, это атрибут проверки, который может вас туда доставить.

public class RangeIfNotEqualToAttribute : RangeAttribute
    {
        string otherProperty;
        public RangeIfNotEqualToAttribute(string otherProperty, int rangeStart, int rangeEnd) :base(rangeStart,rangeEnd)
        {
            this.otherProperty = otherProperty;
        }

        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            var otherPropertyInfo = validationContext.GetType().GetProperty(otherProperty);
            var oldValue = (int)otherPropertyInfo.GetValue(validationContext.ObjectInstance, null);
            if (oldValue == (int)value)
                return ValidationResult.Success;
            return base.IsValid(value, validationContext);
        }
    }

он наследуется от RangeAttribute и возвращает base.IsValid, если текущее значение не равно старому (предполагается, что вы переносите старое значение в какое-то другое свойство этой же модели. изменения в вашей модели

public class SomeViewModel
{
    public int BackupProperty{get;set;}
    [Required]
    [RangeIfNotEqualTo("BackupProperty",10, 20)]
    public int? SomeProperty { get; set; }

    public int? AnotherProperty { get; set; }
}

при передаче модели для просмотра необходимо также скопировать значение SomeProperty в BackupProperty. Кроме того, вы должны отобразить скрытое поле для BackupProperty, чтобы оно было отправлено обратно вместе с моделью. Скрытое поле также важно, если вы хотите реализовать IClientValidatable для включения проверки на стороне клиента. Вы можете увидеть в этот пост для реализации IClientValidatable в аналогичном сценарии

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