也检查一下:
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的password属性中,然后运行该应用程序。
[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。