[英]MVC Model Validation Unobtrusive
我正在使用jquery不干扰方法在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 =“字段Price必须是数字。” 除了新的之外,data-val-decimal =“请输入一个有效的十进制。”
如何保持默认的验证属性不被渲染?
我相信[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;
}
我发现答案是使用$ .extend用允许.33和0.33的正则表达式替换插件中的数字验证
为什么要创建自定义验证器? 默认情况下,MVC将为您验证。 如果将类型设为可空(十进制?),则MVC将在输入非十进制的情况下将UnitPrice设置为null,并且如果模型状态违反您正在执行的任何其他验证,则将使模型状态无效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.