MVC3 有一个新的 jQuery 验证机制,它链接 jQuery 验证和验证属性元数据,这是 jquery.validate.unobtrusive 文件,它获取所有 data- 属性并使用它们,就像之前设置时一样
<add key="UnobtrusiveJavaScriptEnabled" value="false" />
您需要做的就是想出自己的自定义验证属性,为此您有两个选择:
- 创建一个继承
ValidationAttribute接口的自定义验证属性和
覆盖IsValid
或
- 创建一个自我验证模型使用模型
IValidatebleObject,您所需要的只是返回Validate方法
在 MVC3 中,您现在拥有一个可以覆盖的方法,该方法具有 ValidationContext 对象,您可以在其中简单地获取表单中任何其他对象的所有引用、属性和值
创建您自己的,该不显眼的文件将处理您的自定义验证器所需的映射,并将与 jQuery 验证插件一起工作。
你不要更改 javascript...这是 90 年代的风格,而不是 MVC 方式!
例如,如果您想验证,假设 2 个日期,最后一个日期不能小于第一个日期(例如时间段)
public class TimeCard
{
public DateTime StartDate { get; set; }
[GreaterThanDateAttribute("StartDate")]
public DateTime EndDate { get; set; }
}
创建自定义验证
public class GreaterThanDateAttribute : ValidationAttribute
{
public string GreaterThanDateAttribute(string otherPropertyName)
:base("{0} must be greater than {1}")
{
OtherPropertyName = otherPropertyName;
}
public override string FormatErrorMessage(string name)
{
return String.Format(ErrorMessageString, name, OtherPropertyName);
}
public override ValidateionResult IsValid(object value, ValidationContext validationContext)
{
var otherPropertyInfo = validationContext.ObjectTYpe.GetProperty(OtherPropertyName);
var otherDate = (DateTime)otherPropertyInfo.GetValue(validationContext.ObjectInstance, null);
var thisDate = (DateTime)value;
if( thisDate <= otherDate )
{
var message = FormatErrorMessage(validationContext.DisplayName);
return new ValidationResult(message);
}
return null;
}
}
如果使用自我验证模型,那么代码就是
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if( EndDate <= StartDate )
yield return new ValidationResult("EndDate must be grater than StartDate");
}
请记住,自定义验证是通用的,这就是为什么有很多代码,而自我验证模型仅适用于应用的模型。
希望对你有帮助
添加
我没有解释自定义客户端验证部分,随意询问您是否需要示例,但基本上:
在 MVC3 中更容易(当然,如果你了解 jQuery.Validate)你需要做的就是:
- 实施
IClientValidateble
- 实现一个 jQuery 验证方法
- 实现一个不显眼的适配器
要创建这 3 件事,让我们将 GreaterThanDateAttribute 考虑在内并创建自定义客户端验证。为此,我们需要编写以下代码:
附加到GreaterThanDateAttribute
public IEnumerable<ModelCLientValidation> GetCLientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var rule = new ModelCLientValidationRule();
rule.ErrorMessage = FormatErrorMessage(metadata.GetDisplayName());
rule.ValidationType = "greater"; // This is what the jQuery.Validation expects
rule.ValidationParameters.Add("other", OtherPropertyName); // This is the 2nd parameter
yield return rule;
}
然后您需要编写新的 jQuery Validator 和 元数据适配器,将 jQuery.Validation 与您的代码链接起来,为该字段提供正确的 data- 属性(如果当然,UnobtrusiveJavaScriptEnabled 是真的)
创建一个新的js 文件并附加到您的<head>,例如
<script src="@Url.Content("~/Scripts/customValidation.js")" type="text/javascript"></script>
并附加新的验证
jQuery.validator.addMethod("greater", function(value, element, param) {
// we need to take value and compare with the value in 2nd parameter that is hold in param
return Date.parse(value) > Date.parse($(param).val());
});
然后我们编写适配器
jQuery.validator.unobtrusive.adapters.add("greater", ["other"], function(options) {
// pass the 'other' property value to the jQuery Validator
options.rules["greater"] = "#" + options.param.other;
// when this rule fails, show message that comes from ErrorMessage
options.messages["greater"] = options.message;
});