C#属性用于检查一个日期是否早于另一个日期

cLa*_*Lar 13 c# asp.net asp.net-mvc-4

我有一个包含两个DateTime属性的MVC4 Prject的ViewModel:

[Required]
[DataType(DataType.Date)]
public DateTime RentDate { get; set; }

[Required]
[DataType(DataType.Date)]
public DateTime ReturnDate { get; set; }
Run Code Online (Sandbox Code Playgroud)

是否有一种简单的方法来使用C#属性[Compare("someProperty")]来检查天气,RentDate属性的值是否早于ReturnDate的值?

Mik*_*han 25

这是一个非常快速的基本实现(没有错误检查等)应该做你要求的(仅在服务器端...它不会做asp.net客户端javascript验证).我没有测试过,但应该足以让你入门.

using System;
using System.ComponentModel.DataAnnotations;

namespace Test
{
   [AttributeUsage(AttributeTargets.Property)]
   public class DateGreaterThanAttribute : ValidationAttribute
   {
      public DateGreaterThanAttribute(string dateToCompareToFieldName)
      {
          DateToCompareToFieldName = dateToCompareToFieldName;
      }

       private string DateToCompareToFieldName { get; set; }

       protected override ValidationResult IsValid(object value, ValidationContext validationContext)
       {
           DateTime earlierDate = (DateTime)value;

           DateTime laterDate = (DateTime)validationContext.ObjectType.GetProperty(DateToCompareToFieldName).GetValue(validationContext.ObjectInstance, null);

           if (laterDate > earlierDate)
           {
               return ValidationResult.Success;
           }
           else
           {
               return new ValidationResult("Date is not later");
           }
       }
   }


   public class TestClass
   {
       [DateGreaterThan("ReturnDate")]
       public DateTime RentDate { get; set; }

       public DateTime ReturnDate { get; set; }
   }
}
Run Code Online (Sandbox Code Playgroud)


Tre*_*ley 5

看起来您正在使用 DataAnnotations 所以另一种选择是IValidatableObject在视图模型中实现:

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
    if (this.RentDate > this.ReturnDate)
    {
        yield return new ValidationResult("Rent date must be prior to return date", new[] { "RentDate" });
    }
}
Run Code Online (Sandbox Code Playgroud)