也检查一下:
ASP.NET MVC 3 中的验证完整指南 - 第 2 部分
文章的主要部分如下(复制粘贴)。
创建可在客户端和服务器上运行的功能齐全的自定义验证器有四个不同的部分。首先,我们继承ValidationAttribute
并添加我们的服务器端验证逻辑。接下来,我们IClientValidatable
在属性上实现以允许将 HTML5data-*
属性传递给客户端。第三,我们编写了一个在客户端执行验证的自定义 JavaScript 函数。最后,我们创建一个适配器来将 HTML5 属性转换为我们的自定义函数可以理解的格式。虽然这听起来像很多工作,但一旦你开始,你会发现它相对简单。
子类化 ValidationAttribute
在这个例子中,我们将编写一个 NotEqualTo 验证器,它只检查一个属性的值是否不等于另一个属性的值。
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public sealed class NotEqualToAttribute : ValidationAttribute
{
private const string DefaultErrorMessage = "{0} cannot be the same as {1}.";
public string OtherProperty { get; private set; }
public NotEqualToAttribute(string otherProperty)
: base(DefaultErrorMessage)
{
if (string.IsNullOrEmpty(otherProperty))
{
throw new ArgumentNullException("otherProperty");
}
OtherProperty = otherProperty;
}
public override string FormatErrorMessage(string name)
{
return string.Format(ErrorMessageString, name, OtherProperty);
}
protected override ValidationResult IsValid(object value,
ValidationContext validationContext)
{
if (value != null)
{
var otherProperty = validationContext.ObjectInstance.GetType()
.GetProperty(OtherProperty);
var otherPropertyValue = otherProperty
.GetValue(validationContext.ObjectInstance, null);
if (value.Equals(otherPropertyValue))
{
return new ValidationResult(
FormatErrorMessage(validationContext.DisplayName));
}
}
return ValidationResult.Success;
}
}
将新属性添加到 RegisterModel 的密码属性并运行应用程序。
[Required]
[DataType(DataType.Password)]
[Display(Name = "Password")]
[NotEqualTo("UserName")]
public string Password { get; set; }
...
实现 IClientValidatable
ASP.NET MVC 2 有一种添加客户端验证的机制,但它不是很漂亮。值得庆幸的是,在 MVC 3 中,事情得到了改进,这个过程现在相当简单,而且庆幸的是,它不需要Global.asax
像以前的版本那样改变。
第一步是让您的自定义验证属性实现 IClientValidatable。这是一个简单的单一方法接口:
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(
ModelMetadata metadata,
ControllerContext context)
{
var clientValidationRule = new ModelClientValidationRule()
{
ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()),
ValidationType = "notequalto"
};
clientValidationRule.ValidationParameters.Add("otherproperty", OtherProperty);
return new[] { clientValidationRule };
}
如果您现在运行应用程序并查看源代码,您将看到密码输入 html 现在包含您的notequalto
数据属性:
<div class="editor-field">
<input data-val="true" data-val-notequalto="Password cannot be the same as UserName."
data-val-notequalto-otherproperty="UserName"
data-val-regex="Weak password detected."
data-val-regex-pattern="^(?!password$)(?!12345$).*"
data-val-required="The Password field is required."
id="Password" name="Password" type="password" />
<span class="hint">Enter your password here</span>
<span class="field-validation-valid" data-valmsg-for="Password"
data-valmsg-replace="true"></span>
</div>
创建自定义 jQuery 验证函数
所有这些代码最好放在一个单独的 JavaScript 文件中。
(function ($) {
$.validator.addMethod("notequalto", function (value, element, params) {
if (!this.optional(element)) {
var otherProp = $('#' + params);
return (otherProp.val() !=
}
return true;
});
$.validator.unobtrusive.adapters.addSingleVal("notequalto", "otherproperty");
}(jQuery));
根据您的验证要求,您可能会发现 jquery.validate 库已经包含验证本身所需的代码。jquery.validate 中有很多验证器尚未实现或映射到数据注释,因此如果这些验证器满足您的需求,那么您需要用 javascript 编写的只是一个适配器,甚至是对内置适配器的调用,它可以少到只有一行。查看jquery.validate.js以了解可用的内容。
使用现有的 jquery.validate.unobtrusive 适配器
适配器的工作是读取data-*
表单元素上的 HTML5 属性,并将这些数据转换为 jquery.validate 和您的自定义验证函数可以理解的表单。您不需要自己完成所有工作,在许多情况下,您可以调用内置适配器。jquery.validate.unobtrusive 声明了三个可以在大多数情况下使用的内置适配器。这些都是:
jQuery.validator.unobtrusive.adapters.addBool - used when your validator does not need any additional data.
jQuery.validator.unobtrusive.adapters.addSingleVal - used when your validator takes in one piece of additional data.
jQuery.validator.unobtrusive.adapters.addMinMax - used when your validator deals with minimum and maximum values such as range or string length.
jQuery.validator.unobtrusive.adapters.add
如果您的验证器不属于这些类别之一,您需要使用该方法编写自己的适配器。这并不像听起来那么困难,我们将在本文后面看到一个示例。
我们使用该addSingleVal
方法,传入适配器的名称和我们想要传递的单个值的名称。如果验证函数的名称与适配器不同,您可以传入第三个参数 ( ruleName
):
jQuery.validator.unobtrusive.adapters.addSingleVal("notequalto", "otherproperty", "mynotequaltofunction");
至此,我们的自定义验证器就完成了。
为了更好地理解,请参阅提供更多描述和更复杂示例的文章本身。
HTH。