Проверка модели MVC Ненавязчива - PullRequest
0 голосов
/ 12 декабря 2011

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

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

public class DecimalValidator : System.ComponentModel.DataAnnotations.ValidationAttribute, System.Web.Mvc.IClientValidatable
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        decimal val = 0;
        ValidationResult ret = new ValidationResult("Must be a valid decimal");

        if (decimal.TryParse(value.ToString(), out val) )
            return ValidationResult.Success;
        else
            return ret;
    }


    #region IClientValidatable Members

    public System.Collections.Generic.IEnumerable<System.Web.Mvc.ModelClientValidationRule> GetClientValidationRules(System.Web.Mvc.ModelMetadata metadata, System.Web.Mvc.ControllerContext context)
    {
        List<System.Web.Mvc.ModelClientValidationRule> ret = new List<System.Web.Mvc.ModelClientValidationRule>();

        System.Web.Mvc.ModelClientValidationRule validDecimalRule = new System.Web.Mvc.ModelClientValidationRule
        {
            ErrorMessage = "Please enter a valid decimal.",
            ValidationType = "decimal"
        };

        ret.Add(validDecimalRule);

        return ret;
    }

    #endregion
}

И применил это так:

    /// <summary>
    /// The price per unit.
    /// </summary>
    [Range(0, double.MaxValue)]
    [Display(Name = "Price")]
    [DecimalValidator]
    public decimal UnitPrice { get; set; }

Проблема в том, что HTML по-прежнему отображается с data-val-number = "Поле Price должно быть числом." в дополнение к новому, data-val-decimal = "Пожалуйста, введите действительное десятичное число."

Как сохранить атрибуты проверки по умолчанию от визуализации?

Ответы [ 3 ]

0 голосов
/ 13 декабря 2011

Почему вы создаете пользовательский валидатор? MVC будет проверять вас по умолчанию. Если вы сделаете свой тип обнуляемым (десятичным?), Тогда MVC установит для UnitPrice значение NULL, если введен не десятичный знак, а также сделает ваше состояние модели недействительным, если оно нарушает любую другую проверку, которую вы делаете.

0 голосов
/ 14 декабря 2011

Я нашел ответ, чтобы использовать $ .extend для замены проверки числа в плагине на регулярное выражение, которое позволяет .33 и 0.33

0 голосов
/ 13 декабря 2011

Я полагаю, что [Range(0, double.MaxValue)] заставляет его загрузить проверку номера.Попробуйте добавить это в свой пользовательский валидатор и удалить из полевых декораторов.

protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
    decimal val = 0;
    ValidationResult ret = new ValidationResult("Must be a valid decimal");
    ValidationResult rangeRet = new ValidationResult(String.Format("Number must be between 0 and {0}", double.MaxValue.ToString());

    if (decimal.TryParse(value.ToString(), out val) )
        return ValidationResult.Success;
    else if (value < 0 || value > double.MaxValue)
        return rangeRet;
    else
        return ret;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...