model-view-controller – 比较Dates DataAnnotations验证asp.ne
假设我有一个StartDate和一个EndDate,我想检查EndDate是否距离开始日期不超过3个月
public class DateCompare : ValidationAttribute { public String StartDate { get; set; } public String EndDate { get; set; } //Constructor to take in the property names that are supposed to be checked public DateCompare(String startDate,String endDate) { StartDate = startDate; EndDate = endDate; } public override bool IsValid(object value) { var str = value.ToString(); if (string.IsNullOrEmpty(str)) return true; DateTime theEndDate = DateTime.ParseExact(EndDate,"yyyy-MM-dd HH:mm:ss",CultureInfo.InvariantCulture); DateTime theStartDate = DateTime.ParseExact(StartDate,CultureInfo.InvariantCulture).AddMonths(3); return (DateTime.Compare(theStartDate,theEndDate) > 0); } } 我想将此实现到我的验证中
我知道我在这里得到了一个错误……但我怎样才能在asp.net mvc中进行这种业务规则验证 解决方法
这是一个迟到的答案,但我想分享给其他人.这是我如何做到这一点,以便使用不显眼的客户端验证验证所有内容:
>创建属性类: public class DateCompareValidationAttribute : ValidationAttribute,IClientValidatable { public enum CompareType { GreatherThen,GreatherThenOrEqualTo,EqualTo,LessThenOrEqualTo,LessThen } private CompareType _compareType; private DateTime _fromDate; private DateTime _toDate; private string _propertyNameToCompare; public DateCompareValidationAttribute(CompareType compareType,string message,string compareWith = "") { _compareType = compareType; _propertyNameToCompare = compareWith; ErrorMessage = message; } #region IClientValidatable Members /// <summary> /// Generates client validation rules /// </summary> public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata,ControllerContext context) { ValidateAndGetCompareToProperty(metadata.ContainerType); var rule = new ModelClientValidationRule(); rule.ErrorMessage = ErrorMessage; rule.ValidationParameters.Add("comparetodate",_propertyNameToCompare); rule.ValidationParameters.Add("comparetype",_compareType); rule.ValidationType = "compare"; yield return rule; } #endregion protected override ValidationResult IsValid(object value,ValidationContext validationContext) { // Have to override IsValid method. If you have any logic for server site validation,put it here. return ValidationResult.Success; } /// <summary> /// verifies that the compare-to property exists and of the right types and returnes this property /// </summary> /// <param name="containerType">Type of the container object</param> /// <returns></returns> private PropertyInfo ValidateAndGetCompareToProperty(Type containerType) { var compareToProperty = containerType.GetProperty(_propertyNameToCompare); if (compareToProperty == null) { string msg = string.Format("Invalid design time usage of {0}. Property {1} is not found in the {2}",this.GetType().FullName,_propertyNameToCompare,containerType.FullName); throw new ArgumentException(msg); } if (compareToProperty.PropertyType != typeof(DateTime) && compareToProperty.PropertyType != typeof(DateTime?)) { string msg = string.Format("Invalid design time usage of {0}. The type of property {1} of the {2} is not DateType",containerType.FullName); throw new ArgumentException(msg); } return compareToProperty; } } 注意:如果要验证时间长度,请向约束器添加另一个参数,并更改此特定类型的比较的枚举数
$.validator.addMethod("compare",function (value,element,parameters) { // value is the actuall value entered // element is the field itself,that contain the the value (in case the value is not enough) var errMsg = ""; // validate parameters to make sure everyting the usage is right if (parameters.comparetodate == undefined) { errMsg = "Compare validation cannot be executed: comparetodate parameter not found"; alert(errMsg); return false; } if (parameters.comparetype == undefined) { errMsg = "Compare validation cannot be executed: comparetype parameter not found"; alert(errMsg); return false; } var compareToDateElement = $('#' + parameters.comparetodate).get(); if (compareToDateElement.length == 0) { errMsg = "Compare validation cannot be executed: Element to compare " + parameters.comparetodate + " not found"; alert(errMsg); return false; } if (compareToDateElement.length > 1) { errMsg = "Compare validation cannot be executed: more then one Element to compare with id " + parameters.comparetodate + " found"; alert(errMsg); return false; } //debugger; if (value && !isNaN(Date.parse(value))) { //validate only the value contains a valid date. For invalid dates and blanks non-custom validation should be used //get date to compare var compareToDateValue = $('#' + parameters.comparetodate).val(); if (compareToDateValue && !isNaN(Date.parse(compareToDateValue))) { //if date to compare is not a valid date,don't validate this switch (parameters.comparetype) { case 'GreatherThen': return new Date(value) > new Date(compareToDateValue); case 'GreatherThenOrEqualTo': return new Date(value) >= new Date(compareToDateValue); case 'EqualTo': return new Date(value) == new Date(compareToDateValue); case 'LessThenOrEqualTo': return new Date(value) <= new Date(compareToDateValue); case 'LessThen': return new Date(value) < new Date(compareToDateValue); default: { errMsg = "Compare validation cannot be executed: '" + parameters.comparetype + "' is invalid for comparetype parameter"; alert(errMsg); return false; } } return true; } else return true; } else return true; }); 这只关注客户端不显眼的验证.如果你需要服务器端,你必须在isValid方法的覆盖中有一些逻辑.此外,您可以使用Reflection使用显示属性等生成错误消息,并使消息参数可选. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc-4 – DataAnnotation Range属性的客户端验证之
- asp.net-mvc-3 – 如何在WebGrid中隐藏列?
- asp.net-mvc – 在asp.net mvc应用程序中防止多个POST
- asp.net – 自定义OWIN / Katana UserManager工厂行为
- asp.net – 在Repeater控件中实现功能链接
- asp.net – 获取ListView中动态添加的控件的值
- asp.net-mvc-2 – ASP.NET MVC 2显示名称DataAnnotion from
- asp.net – 在IIS 7或IIS 7.5集成模式下,默认文档中可能不会
- rest – 使用WebAPI删除多个ID删除端点?
- asp.net-mvc – ASP.NET MVC模型验证错误本地化上下文
- asp.net-mvc – Asp.net 5(vnext)是否可以使用?
- asp.net-mvc-3 – 方法’Write’没有重载需要0个
- asp.net-mvc-3 – Asp.Net MVC 3 – @ Html.Acti
- asp-classic – 在Classic ASP中的应用程序范围中
- asp.net – jQuery flot,来自SQL Server的Live p
- asp.net – MembershipProvider在代码中更改连接
- asp.net – 在Visual Studio 2015中保存* .cs或*
- asp.net-mvc – 如何将我的对象保存回LINQ to SQ
- 如何编辑asp.net网站?我对.cs文件所做的更改不会
- 从ASP.Net MVC视图访问应用程序设置