先来说说什么叫做「不等于验证」此验证就是和内建的 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