2010-08-31 46 views
12

我将为明天编写一个会议应用程序编写一个自定义日期验证类,该应用程序将在验证给定的开始日期或结束日期是否为A)小于当前日期,或B)开始日期大于会议的结束日期(反之亦然)。.NET MVC自定义日期验证程序

我认为这可能是一个相当普遍的要求。任何人都可以指向我的博客文章的方向,可以帮助我解决这个问题?

我使用.NET 3.5,所以我不能使用内置于.NET 4项目我工作的新模式验证API是MVC 2

UPDATE:课堂上,我很写需要扩展System.ComponentModel.DataAnnotations命名空间。在.NET 4中有一个你可以实现的IValidateObject接口,它使得这种事情成为一种绝对的蠢事,但是很遗憾我无法使用.Net 4.我如何去做.Net 3.5中的同样的事情?

+0

我刚刚一直在努力。也许这将帮助: [CompareDatesValidator] [1] [1]:http://stackoverflow.com/questions/2848684/compare-dates-dataannotations-validation-asp-net-mvc/8070779 #8070779 – free4ride 2011-11-09 19:58:23

+0

我刚刚一直在努力。也许这将帮助: [此处输入链接的描述] [1] [1]:http://stackoverflow.com/questions/2848684/compare-dates-dataannotations-validation-asp-net- mvc/8070779#8070779 – free4ride 2011-11-09 20:00:01

回答

21
public sealed class DateStartAttribute : ValidationAttribute 
    {   
     public override bool IsValid(object value) 
     { 
      DateTime dateStart = (DateTime)value; 
      // Meeting must start in the future time. 
      return (dateStart > DateTime.Now); 
     } 
    } 

    public sealed class DateEndAttribute : ValidationAttribute 
    { 
     public string DateStartProperty { get; set; } 
     public override bool IsValid(object value) 
     { 
      // Get Value of the DateStart property 
      string dateStartString = HttpContext.Current.Request[DateStartProperty]; 
      DateTime dateEnd = (DateTime)value; 
      DateTime dateStart = DateTime.Parse(dateStartString); 

      // Meeting start time must be before the end time 
      return dateStart < dateEnd; 
     } 
    } 

,并在您的视图模型:

[DateStart] 
public DateTime StartDate{ get; set; } 

[DateEnd(DateStartProperty="StartDate")] 
public DateTime EndDate{ get; set; } 

在你的行动,只是检查ModelState.IsValid。那你在追求什么?

+0

看起来不错,我目前无法测试,但我可以在一天结束的时候完成测试。谢谢! – MrBliz 2010-09-01 09:45:26

+0

在这种情况下,我如何从模型中获取StartDate和EndDate的值,因为它们都是用户输入的值? – MrBliz 2010-09-01 13:16:52

+0

更改了我的答案。 :)因此,StartDate使用DateTime.Now进行检查。 EndDate检查用户输入的StartDate以确保它在开始日期之后。 – 2010-09-02 01:36:14

1

我想这应该这样做:

public boolean MeetingIsValid(DateTime start, DateTime end) 
{ 
     if(start < DateTime.Now || end < DateTime.Now) 
      return false; 

     return start > end || end < start; 
} 
+0

嗨,谢谢你,看完你回答我意识到我需要提供我的信息。当然你提供的代码会验证一个日期,但这并不是我遇到的问题的一部分。我需要知道要实现哪些接口来扩展数据注释名称空间。不管怎么说,还是要谢谢你。 – MrBliz 2010-09-01 06:01:03

4

我知道这篇文章比较老,但是我发现这个解决方案好多了。

如果对象在视图模型的一部分中有一个前缀,则此接受的解决方案将不起作用。

即行

// Get Value of the DateStart property 
string dateStartString = HttpContext.Current.Request[DateStartProperty]; 

更好的解决方案可以在这里找到: http://www.a2zdotnet.com/View.aspx?Id=182

+0

绝对是更好的解决方案! +1为有用的链接! – DanO 2012-06-21 15:00:38

+0

无效链接:-(... – nashwan 2017-04-03 13:03:38