我问类似的问题
here,但在这个问题我使用另一个实现,正好
this way以下代码显示我的实现:
模型:
public class Department { public long Id { get; set; } [IsDateAfter("Date2",true,ErrorMessage = "O My")] public DateTime Date1 { get; set; } public DateTime Date2 { get; set; } public string Name1 { get; set; } public string Name2 { get; set; } }
自定义验证器:
public sealed class IsDateAfter : ValidationAttribute,IClientValidatable { private readonly string testedPropertyName; private readonly bool allowEqualDates; public IsDateAfter(string testedPropertyName,bool allowEqualDates = false) { this.testedPropertyName = testedPropertyName; this.allowEqualDates = allowEqualDates; } protected override ValidationResult IsValid(object value,ValidationContext validationContext) { var propertyTestedInfo = validationContext.ObjectType.GetProperty(this.testedPropertyName); if (propertyTestedInfo == null) { return new ValidationResult(string.Format("unknown property {0}",this.testedPropertyName)); } var propertyTestedValue = propertyTestedInfo.GetValue(validationContext.ObjectInstance,null); if (value == null || !(value is DateTime)) { return ValidationResult.Success; } if (propertyTestedValue == null || !(propertyTestedValue is DateTime)) { return ValidationResult.Success; } // Compare values if ((DateTime)value >= (DateTime)propertyTestedValue) { if (this.allowEqualDates) { return ValidationResult.Success; } if ((DateTime)value > (DateTime)propertyTestedValue) { return ValidationResult.Success; } } return new ValidationResult(FormatErrorMessage(validationContext.DisplayName)); } public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata Metadata,ControllerContext context) { var rule = new ModelClientValidationRule { ErrorMessage = this.ErrorMessageString,ValidationType = "isdateafter" }; rule.ValidationParameters["propertytested"] = this.testedPropertyName; rule.ValidationParameters["allowequaldates"] = this.allowEqualDates; yield return rule; } }
脚本:
$.validator.unobtrusive.adapters.add( 'isdateafter',['propertytested','allowequaldates'],function (options) { options.rules['isdateafter'] = options.params; options.messages['isdateafter'] = options.message; }); $.validator.addMethod("isdateafter",function (value,element,params) { alert(params.propertytested); var startdatevalue = $('input[name="' + params.propertytested + '"]').val(); if (!value || !startdatevalue) return true; return (params.allowequaldates) ? Date.parse(startdatevalue) <= Date.parse(value) : Date.parse(startdatevalue) < Date.parse(value); },'');
和我的_Layout页面(主页)
<!DOCTYPE html> <html> <head> <title>@ViewBag.Title</title> <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" /> <script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"> </script> <script src="@Url.Content("~/Scripts/MicrosoftAjax.js")" type="text/javascript"> </script> <script src="@Url.Content("~/Scripts/MicrosoftMvcAjax.js")" type="text/javascript"> </script> <script src="@Url.Content("~/Scripts/MicrosoftMvcValidation.js")" type="text/javascript"></script> <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> <script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"> </script> <script src="@Url.Content("~/Scripts/jQuery.IsDateAfter.js")" type="text/javascript"></script> </head> <body> <div class="page"> <div id="header"> <div id="title"> <h1> My MVC Application</h1> </div> <div id="logindisplay"> @Html.Partial("_logonPartial") </div> <div id="menucontainer"> <ul id="menu"> <li>@Html.ActionLink("Departments","Index","Department")</li> </ul> </div> </div> <div id="main"> @RenderBody() </div> <div id="footer"> </div> </div> </body> </html>
当然,在“编辑和创建视图”页面中,另一个脚本源如下所示:
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"> </script> <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
创建页面Dom的一部分:
<fieldset> <legend>Department</legend> <div class="editor-label"> <label for="Date1">Date1</label> </div> <div class="editor-field"> <input id="Date1" class="text-Box single-line valid" type="text" value="" name="Date1" data-val-required="The Date1 field is required." data-val-isdateafter- propertytested="Date2" data-val-isdateafter-allowequaldates="False" data-val- isdateafter="O My" data-val="true"> <span class="field-validation-valid" data-valmsg-replace="true" data-valmsg- for="Date1"></span> </div> <div class="editor-label"> <label for="Date2">Date2</label> </div> <div class="editor-field"> <input id="Date2" class="text-Box single-line valid" type="text" value="" name="Date2" data-val-required="The Date2 field is required." data-val="true"> <span class="field-validation-valid" data-valmsg-replace="true" data-valmsg- for="Date2"></span> </div>
我尝试所有的实现与here相同但是不能在客户端工作,需要回发,我没有任何其他实现,例如在global.asax中的注册
像this,有谁知道吗?我真的很困惑,我尝试了2路,但没有一个给出真正的答案.
解决方法
你搞砸了你的脚本包含.在您的_Layout中,您按照以下顺序包括以下脚本:
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> <script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script> <script src="@Url.Content("~/Scripts/jQuery.IsDateAfter.js")" type="text/javascript"></script>
现在显然jquery.validate.min.js和jquery.validate.js代表相同的脚本,第一个是最小化的版本.但是由于您没有包含jquery.validate.unobtrusive.js脚本(这在您的视图中稍后执行),您的自定义jQuery.IsDateAfter.js脚本将包含错误,因为它不会知道$.validator.unobtrusive .adapters对象您正在使用.所以这里你的布局应该如何看待脚本:
<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script> <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
您也可以将自定义的jQuery.IsDateAfter.js脚本添加到布局中,如果您希望在许多视图中使用,并且如果不能将其添加到视图中:
<script src="@Url.Content("~/Scripts/jQuery.IsDateAfter.js")" type="text/javascript"></script>
这是您应该在视图中唯一的脚本.您应该从“编辑和创建视图”页面中删除任何其他jquery *脚本包含.
注意:您还将注意到我已经从布局中删除了所有Microsoft * .js脚本.它们已经过时,不应再在ASP.NET MVC 3中使用.