【发布时间】:2011-11-01 09:24:17
【问题描述】:
我的项目中有一个情景,我必须比较日期才能确定开始日期是否大于结束日期。到目前为止,MVC3 没有提供自己的属性来比较日期。所以为此我创建了自己的自定义属性来比较日期 下面给出了
命名空间 WebUtil.Validators { 使用系统; 使用 System.Collections.Generic; 使用 System.ComponentModel.DataAnnotations; 使用 System.Web.Mvc; 使用 WebUtil.Resources;
public class CompareDateAttribute : ValidationAttribute, IClientValidatable
{
public CompareDateAttribute(string otherPropertyName)
: base(WebUtilResources.Validation_Invalid_Dates)
{
this.OtherControlName = otherPropertyName;
}
public string OtherControlName { get; set; }
public override string FormatErrorMessage(string name)
{
return string.Format(ErrorMessageString, name, this.OtherControlName);
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(
ModelMetadata metadata, ControllerContext context)
{
var greaterRule = new ModelClientValidationRule();
greaterRule.ErrorMessage = this.FormatErrorMessage(metadata.GetDisplayName());
greaterRule.ValidationType = "greater";
greaterRule.ValidationParameters.Add("other", this.OtherControlName);
yield return greaterRule;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var otherPropertyInfo = validationContext.ObjectType.GetProperty(this.OtherControlName);
var otherDate = (DateTime)otherPropertyInfo.GetValue(validationContext.ObjectInstance, null);
var thisDate = (DateTime)value;
if (thisDate <= otherDate)
{
var message = this.FormatErrorMessage(validationContext.DisplayName);
return new ValidationResult(message);
}
return null;
}
}
}
在创建此属性以便在客户端进行此验证后,我已向 JQuery 不显眼的验证器添加了一个方法,如下所示。
jQuery.validator.addMethod("greater", function (value, element, param) {
return Date.parse(value) > Date.parse($(param).val());
});
jQuery.validator.unobtrusive.adapters.add("greater", ["other"], function (options) {
options.rules["greater"] = "#" + options.params.other;
options.messages["greater"] = options.message;
});
jQuery.validator.addMethod('greaterThanDate', function (value, element, params) {
var date = value.toString().split('/');
var PassDay = date[0];
var PassMonth = date[1];
var passyear = date[2];
if (PassDay != null && PassMonth != null && passyear != null) {
var passDate = new Date(passyear, PassMonth - 1, PassDay);
var currentdate = new Date();
return passDate < currentdate;
}
return true;
}, '');
// and an unobtrusive adapter
jQuery.validator.unobtrusive.adapters.add('futuredate', {}, function (options) {
options.rules['greaterThanDate'] = true;
options.messages['greaterThanDate'] = options.message;
});
但是,除了当前稳定版本的 Chrome 之外,此验证在所有浏览器中都适用于我。我很困惑。谁能帮我解决这个问题?
【问题讨论】:
标签: jquery asp.net-mvc asp.net-mvc-3 google-chrome