ASP.NET MVC3 Проверка данных DataAnnotations сделать меньше или равно другому свойству с проверкой на стороне клиента - PullRequest
3 голосов
/ 28 марта 2011

У меня есть простая форма, в которой используется ненавязчивая проверка на стороне клиента ASP.NET MVC 3.

Модель выглядит примерно так (имена изменены для конфиденциальности):

public class MyInputModel
{
    public MyInputModel()
    {
    }

    public MyInputModel(MyViewData viewData)
    {
        ViewData = viewData;
        MaxValueForSize = viewData.MaxSize;
    }

    public int MaxValueForSize { get; set; }


    [RegularExpression("[1-9][0-9]*",ErrorMessage = "The value must be a whole number.")]
    public int Size { get; set; }

    [StringLength(255)]
    [Required]
    public string Description{ get; set; }
}

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

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

internal class SizeValidAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if(value != null)
        {
            var model = (MyInputModel) validationContext.ObjectInstance;


            if ((int)value > model.MaxValueForSize)
                return new ValidationResult(ErrorMessage);

        }
        return base.IsValid(value, validationContext);
    }
}

Однако я хотел бы (нужно) иметь проверку на стороне клиента для этого свойства.Подобно тому, как работает аннотация Compare.

Кто-нибудь знает способ сделать это?Нужно ли как-то продлевать валидацию на стороне клиента?

Спасибо за вашу помощь.

Ответы [ 3 ]

4 голосов
/ 28 марта 2011

Посмотрите на эту статью.В нем объясняется, как расширить проверку модели ASP.NET MVC для поддержки проверки по нескольким полям:

Расширение проверки ASP.NET MVC
http://blogs.msdn.com/b/mikeormond/archive/2010/10/05/extending-asp-net-mvc-s-validation.aspx

2 голосов
/ 30 марта 2011

Ответ Роберта Харви направил меня по правильному пути, но в ASP.NET MVC3 можно просто переопределить проверку, используя следующий шаблон:

public class LessThanOrEqualToPropertyAttribute : ValidationAttribute, IClientValidatable
{
    public string OtherProperty { get; set; }

    public override bool IsValid(object value)
    {
        return true;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value != null)
        {
            PropertyInfo propertyInfo = validationContext.ObjectType.GetProperty(OtherProperty);

            var otherValue = propertyInfo.GetGetMethod().Invoke(validationContext.ObjectInstance, null);

            if ((int)otherValue < (int)value)
                return new ValidationResult(ErrorMessage);

        }
        return base.IsValid(value, validationContext);
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule
        {
            ValidationType = "lessthanorequaltoproperty",
            ErrorMessage = FormatErrorMessage(ErrorMessage),
        };

        rule.ValidationParameters.Add("otherproperty", OtherProperty);

        yield return rule;
    }
}

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

1 голос
/ 08 марта 2012

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

...