本文转自:http://www.cnblogs.com/zhangliangzlee/archive/2012/07/26/2610071.html

Model:

public class ModelDateTime
{
private const string strErrorNotNull = "*必填项"; [DisplayName("开始时间")]
[Required(ErrorMessage = strErrorNotNull)]
public DateTime StartDate { get; set; } [DisplayName("结束时间")]
[Required(ErrorMessage = strErrorNotNull)]
[DateTimeNotLessThan("StartDate", "开始时间")]//这个是自定义的数据验证
public DateTime EndDate { get; set; } }

自定义的数据验证类:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class DateTimeNotLessThan : ValidationAttribute, IClientValidatable
{
private const string DefaultErrorMessage = "{0} 不得小于 {1}."; public string OtherProperty { get; private set; }
private string OtherPropertyName { get; set; } public DateTimeNotLessThan(string otherProperty, string otherPropertyName)
: base(DefaultErrorMessage)
{
if (string.IsNullOrEmpty(otherProperty))
{
throw new ArgumentNullException("otherProperty");
} OtherProperty = otherProperty;
OtherPropertyName = otherPropertyName;
} public override string FormatErrorMessage(string name)
{
return string.Format(ErrorMessageString, name, OtherPropertyName);
} 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); DateTime dtThis = Convert.ToDateTime(value);
DateTime dtOther = Convert.ToDateTime(otherPropertyValue); if (dtThis<dtOther)
{
return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
}
}
return ValidationResult.Success;
} public IEnumerable<ModelClientValidationRule> GetClientValidationRules(
ModelMetadata metadata,
ControllerContext context)
{
var clientValidationRule = new ModelClientValidationRule()
{
ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()),
ValidationType = "notlessthan"//这里是核心点
}; clientValidationRule.ValidationParameters.Add("otherproperty", OtherProperty); return new[] { clientValidationRule };
}
}

Server端验证

自定义Server端的validation属性,需要继承自ValidationAttribute,主要方法就是重载IsValid方法。

IsValid的方法有两个;
IsValid(Object value)
IsValid(Object value, ValidationContext validationContext)

第一个是比较常用的方法,即取到当前field的值;第二个比较特殊,它还传送了这个field的上下文,通过这个上下文,可以取到这个class中的其他field,例如:

var otherProperty = validationContext.ObjectInstance.GetType().GetProperty(OtherProperty);

Client验证

Client验证主要是个这个field添加验证规则的名称和传递一系列的参数,然后将这个属性添加到前台的html元素中,结合javascript来进行客户端的验证。
要自定义Client端的验证规则,需继承IClientValidatable接口。
实现方法:
publicIEnumerable<ModelClientValidationRule>GetClientValidationRules(ModelMetadata metadata, ControllerContext  context)
这个方法的返回值是可枚举的ModelClientValidationRule;换言之,这是个获取客户端验证规则的接口,自定义验证规则,需要从ModelClientValidationRule继承派生类。
ModelClientValidationRule有3个重要的property:

  • ErrorMessage : String
  • ValidationParameters : IDictionary<String, Object>
  • ValidationType : String

ErrorMessage不用说了,就是错误消息;
ValidationParameters,是一个hash表,key就是参数的名称,value中存参数的值;

ValidationType,这个东西是和前台的javascript相对应的,.NET MVC3默认用的是jQuery.validation,所以ValidationType的值还需要和其中的验证方法相对应,在自定义验证规则后,还需要在前台添加对应的javascript,将自定义的验证的方法加入了jQuery.validation插件中。

前台的JS代码:

(function ($) {
$.validator.addMethod("notlessthan", function (value, element, params) {
if (!this.optional(element)) {
var otherProp = $('#' + params)
return (otherProp.val() < value);
}
return true;
});
$.validator.unobtrusive.adapters.addSingleVal("notlessthan", "otherproperty");
} (jQuery));

Html的代码:

new { @class = "njt-datetime-minute-picker Wdate" }:是我调用的一个日期控件
@using (Html.BeginForm())
{
<div>
<div>
@Html.LabelFor(model => model.StartDate):
@Html.TextBox("StartDate","", new { @class = "njt-datetime-minute-picker Wdate" })&nbsp;
@Html.ValidationMessageFor(model => model.StartDate)
</div>
<div>
@Html.LabelFor(model => model.EndDate):
@Html.TextBox("EndDate","", new { @class = "njt-datetime-minute-picker Wdate" })&nbsp;
@Html.ValidationMessageFor(model => model.EndDate)
</div>
<p><input type="submit" value="提交" /></p>
</div>
}

附上完整的Demo:MVC数据验证(两个日期之间的比较判断).rar

[转]MVC自定义数据验证(两个时间的比较)的更多相关文章

  1. <转>ASP.NET学习笔记之MVC 3 数据验证 Model Validation 详解

    MVC 3 数据验证 Model Validation 详解  再附加一些比较好的验证详解:(以下均为引用) 1.asp.net mvc3 的数据验证(一) - zhangkai2237 - 博客园 ...

  2. MVC中数据验证

    http://www.studyofnet.com/news/339.html http://www.cnblogs.com/kissdodog/archive/2013/05/04/3060278. ...

  3. 期货大赛项目|四,MVC的数据验证

    上图先看下效果 样式先不说,先了解下数据验证是怎么实现的 一 必须是强类型的视图 二 这些显示提示的话语,都在强类型的实体中 三 必须使用Html.BeginForm或者Html.AjaxBeginF ...

  4. MVC 多种 数据验证 post

    技术:c# .net  采用mvc框架,实现model的数据验证. 刚开始觉得数据验证很方便,可以判断非空.数据正确性,但是后来发现很多需要数据库的判定还是需要post请求做,但是就想mvc的数据验证 ...

  5. (转)MVC 3 数据验证 Model Validation 详解

    继续我们前面所说的知识点进行下一个知识点的分析,这一次我们来说明一下数据验证.其实这是个很容易理解并掌握的地方,但是这会浪费大家狠多的时间,所以我来总结整理一下,节约一下大家宝贵的时间. 在MVC 3 ...

  6. ASP.NET MVC 扩展数据验证 转

    此文只作记录 public class MaxWordsAttribute : ValidationAttribute { public MaxWordsAttribute(int maxWords) ...

  7. MVC 3 数据验证 Model Validation 详解

    在MVC 3中 数据验证,已经应用的非常普遍,我们在web form时代需要在View端通过js来验证每个需要验证的控件值,并且这种验证的可用性很低.但是来到了MVC 新时代,我们可以通过MVC提供的 ...

  8. 【MVC】ASP.NET MVC之数据验证

    前端传到后端数据的不可信任性,DRY("Don't Repeat Yourself") 设计原则.MVC3.0出了后端数据验证特性,鼓励你只定义一次功能或行为,然后在应用程序中各处 ...

  9. MVC Model数据验证

    概述 上节我们学习了Model的数据在界面之间的传递,但是很多时候,我们在数据传递的时候为了确保数据的有效性,不得不给Model的相关属性做基本的数据验证. 本节我们就学习如何使用 System.Co ...

随机推荐

  1. DedeCMS Error:Tag disabled:"php"的解决办法

  2. 第二百四十一天 how can I 坚持

    今天去了趟小米之家,红米note3感觉还好吧.小米,希望不会令人失望啊,很看好的,应该不算是米粉吧. 腾讯课堂. hadoop. 摄影. 没有真正的兴趣啊,一心只想着玩,什么事真正的兴趣,就是无时无刻 ...

  3. NLog 錯誤小記

    IISExpress使用NLog遇到寫入權限錯誤,特記錄下來: NLog配置文件中指定FileName時需要指定為當前目錄,如不指定會產生 拒絕訪問 錯誤, 估計為不指定當前目錄時會將文件寫入iise ...

  4. Tengine新增健康检查模块

    总结 2.tengine的状态监控 Tengine的状态监控有两种 这里演示一个健康检查模块功能 配置一个status的location location /status { check_status ...

  5. rsync 无密码传输文件

    最近机器迁移,需要备份文件,但各个机器间不能穿梭,即无法通过scp来传输文件, 在运维的建议下,选用了rsync作为传输的工具. 默认情况Ubuntu安装了rsync服务,但在/etc下没有配置文件, ...

  6. HDU 1702 队列与栈的简单运用http://acm.hdu.edu.cn/showproblem.php?pid=1702

    #include<stdio.h> #include<string.h> #include<queue> #include<stack> #define ...

  7. 学习php 韩顺平

    1.动态语言的发展史 最早使用cgi 学习 apache  全世界最流行的web服务器 php运行流程 → apache→php文件→数据库→php文件→浏览器 php底层语言是c语言 jsp底层语言 ...

  8. VS 2012单元测试和测试资源管理器

    时间:2012-08-27 17:29 来源:张善友 博客园 字体:[大 中 小] 现在您可以在您的项目当中自行选择 NUnit 或是 xUnit 之类的套件. 而且这次的测试资源管理器也完全以”信息 ...

  9. 剑指OFFER之调整数组顺序使奇数位于偶数前面找(九度OJ1516)

    题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 输入: 每个输 ...

  10. C# WinForm控件、自定义控件整理(大全)

    转:http://www.cnblogs.com/top5/archive/2010/04/29/1724039.html 对C# WinForm开发系列收集的控件使用方面进行整理, 加入了一些文章, ...