自定义属性的 ASP.NET MVC 客户端验证

Posted

技术标签:

【中文标题】自定义属性的 ASP.NET MVC 客户端验证【英文标题】:ASP.NET MVC client-side validation of custom attribute 【发布时间】:2014-11-03 21:40:17 【问题描述】:

如何在客户端触发自定义验证器? 这是我到目前为止所拥有的:

我的验证类:

public class AlmostEqual : ValidationAttribute, IClientValidatable

    private readonly string _otherProperty;
    private readonly float _myPercent;
    public AlmostEqual(string otherProperty,float percent)
    
        _otherProperty = otherProperty;
        _myPercent = percent;
    


    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    
        var property = validationContext.ObjectType.GetProperty(_otherProperty);

        var otherPropertyValue = property.GetValue(validationContext.ObjectInstance, null);

        dbEntities db = new dbEntities();
        Metal metal = db.Metals.Find(Convert.ToInt32(otherPropertyValue));

        double _unitWeight = metal.UnitWeight;
        double _percent = metal.UnitWeight * (_myPercent / 100);

        double myProperty = double.Parse(value.ToString());

        bool result = myProperty >= _unitWeight - _percent && myProperty <= _unitWeight + _percent;

        if (!result)
        
             return new ValidationResult(string.Format(
                    CultureInfo.CurrentCulture,
                    FormatErrorMessage(validationContext.DisplayName),
                    new[]  _otherProperty 
                ));
        


        return null;
    


    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    
        var rule = new ModelClientValidationRule
        
            ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()),
            ValidationType = "almostequal",
        ;
        rule.ValidationParameters.Add("other", _otherProperty);
        yield return rule;
    



来自 Metadata 类的代码:

        [Required]           
        [AlmostEqual("IDMetal",5,ErrorMessage="Weight do not correspond with dimensions.")]
        public Nullable<double> UnitWeight  get; set; 
    

鉴于我添加了这个js:

<script type="text/javascript">
      $.validator.unobtrusive.adapters.addBool("almostequal", "Range");
</script>

我的 webconfig 包含:

 <add key="ClientValidationEnabled" value="true" />
 <add key="UnobtrusiveJavaScriptEnabled" value="true" />

我得到错误:

未捕获的类型错误:无法读取文件中未定义的属性“调用” jquery.validate.min.js 在第 27 行

【问题讨论】:

请看:***.com/questions/4747184/… 链接来自这篇文章。 抱歉,更新了正确的网址 但是我不明白为什么当我们有一个类来进行验证时我们应该创建一个 javascript 函数。 这就是原因,客户端JavaScript函数被称为适配器。它可以将您的服务器验证内容转换为客户端。不幸的是,没有直接的方法可以将您的服务器行为转换为客户端。 【参考方案1】:

看看这个:http://thewayofcode.wordpress.com/tag/custom-unobtrusive-validation/

我能在您的代码中发现的唯一区别是您创建 $.validator.unobtrusive.adapters.addBool 函数的方式。参数略有不同,但问题可能在于您没有定义适配器的规则部分。

尝试使用类似的东西:

$.validator.unobtrusive.adapters.add("almostequal", function (options) 
    options.rules["almostequal"] = "#" + options.element.name.replace('.', '_'); // mvc html helpers
    options.messages["almostequal"] = options.message;
);

关于规则:

此 HTML 元素的 jQuery 规则数组。适配器应该为它想要附加的特定 jQuery Validate 验证器添加项目到这个规则数组。 name 为 jQuery Validate 规则的名称,value 为 jQuery Validate 规则的参数值。

【讨论】:

以上是关于自定义属性的 ASP.NET MVC 客户端验证的主要内容,如果未能解决你的问题,请参考以下文章

自定义验证属性中的客户端验证 - asp.net mvc 4

ASP.NET MVC3 - 自定义验证属性 -> 客户端损坏

在 Asp.net Core MVC 中定义自定义客户端验证规则

ASP.NET MVC2 自定义 jQuery 验证:客户端

ASP.NET MVC:通过 DataAnnotation 进行自定义验证

ASP .Net MVC 3:自定义不显眼的验证