ASP.NET MVC3 自定义验证规则,增加一个不等于的验证

  先来说说什么叫做「不等于验证」此验证就是和内建的 Compare 刚好相反,您可以自订某一栏位的值不能与另一个栏位相同,应用层面也满广的,比如有个栏位要输入亲子关係,那A姓名就不能等于B姓名,而且这次介绍的是弹性最高的 addMethod 所以如果你有什么很神奇的想法,这篇就是一定要学会的。

  一开始就建立一个自订的验证规则出来吧,这次名称就取为「NotequalToAttribute」,代码如下

  

public class NotEqualToAttribute : ValidationAttribute, IClientValidatable
    {
        /// <summary>
        /// Gets the other property.
        /// </summary>
        public string OtherProperty { get; private set; }
        /// <summary>
        /// Initializes a new instance of the <see cref="NotEqualToAttribute"/> class.
        /// </summary>
        /// <param name="otherProperty">要比对的属性名称</param>
        public NotEqualToAttribute(string otherProperty)
        {
            OtherProperty = otherProperty;
        }

        /// <summary>
        /// 根据目前的验证属性,验证指定的值。
        /// </summary>
        /// <param name="value">要验证的值。</param>
        /// <param name="validationContext">有关验证作业的内容资讯。</param>
        /// <returns>
        ///   <see cref="T:System.ComponentModel.DataAnnotations.ValidationResult"/> 类别的执行个体。
        /// </returns>
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            var property = validationContext.ObjectType.GetProperty(OtherProperty);
            if (property == null)
            {
                return new ValidationResult(
                    string.Format(
                        CultureInfo.CurrentCulture,
                        "{0} 不存在",
                        OtherProperty
                    )
                );
            }
            var otherValue = property.GetValue(validationContext.ObjectInstance, null);
            if (object.Equals(value, otherValue))
            {
                return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
            }
            return null;
        }

        /// <summary>
        /// 在类别中实作时,传回该类别的用户端验证规则。
        /// </summary>
        /// <param name="metadata">模型中继资料。</param>
        /// <param name="context">控制器内容。</param>
        /// <returns>
        /// 此验证程式的用户端验证规则。
        /// </returns>
        public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
        {
            var rule = new ModelClientValidationRule
            {
                ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()),
                ValidationType = "notequalto",
            };
            rule.ValidationParameters["other"] = OtherProperty;
            yield return rule;
        }
    }

这次有几点比较不一样,首先在第27行的时候,我们多传入了一个「ValidationContext validationContext」参数,因为传入了它,我们才可以利用反射去取得指定的栏位是否存在(指定栏位的时候使用弱型别所以少了这验证就很容易发生拼错、打错而导致栏位不存在的错误),验证存在后再利用反射取得输入的值来做比对验证。

[NotEqualTo("UserName", ErrorMessage = "介紹人與Username不能相同")]
[Display(Name = "介紹人")]
public string Introducer { get; set; }

在本范例的设定是不可以输入和 username 栏位的值相同

View 增加以下 Code:

<div class="editor-label">
    @Html.LabelFor(m => m.Introducer)
</div>
<div class="editor-field">
    @Html.TextBoxFor(m => m.Introducer)
    @Html.ValidationMessageFor(m => m.Introducer)
</div>

接着扩充js

jQuery.validator.addMethod('notEqualTo', function (value, element, param) {
        return this.optional(element) || value != $(param).val();
    });
    jQuery.validator.unobtrusive.adapters.add(
        'notequalto', ['other'], function (options) {
            options.rules['notEqualTo'] = '#' + options.params.other;
            if (options.message) {
                options.messages['notEqualTo'] = options.message;
            }
        });

到目前为止前端验证的扩充已经介绍完毕了,如果您还有什么不是很了解的地方其实直接打开【jquery.validate.unobtrusive.js】从第188行到第261行就有很明确的说明,相当的好上手.

 

via:http://demo.tc/Post/691

posted on 2013-12-18 16:37  唐扬名  阅读(517)  评论(0编辑  收藏  举报

导航