MVC模型验证不引人注目

时间:2011-12-12 17:13:48

标签: javascript jquery model-view-controller validation

我使用jquery unobtrusive方法在UI中验证我的模型。我在模型中有一个数字字段,我想要验证为数字。开箱即用,几乎可以正常工作。在验证.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 =&#34;字段价格必须是数字。&#34; 除了新的,      data-val-decimal =&#34;请输入有效的小数。&#34;

如何保持默认验证属性不被渲染?

3 个答案:

答案 0 :(得分:0)

我相信[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;
}

答案 1 :(得分:0)

我发现答案是使用$ .extend将插件中的数字验证替换为允许.33和0.33

的正则表达式

答案 2 :(得分:-1)

为什么要创建自定义验证器? MVC默认会为您验证。如果你的类型为nullable(十进制?),那么如果输入非十进制,MVC会将UnitPrice设置为null,如果它违反你正在进行的任何其他验证,则使模型状态无效。