2012-08-27 17 views
3

我使用视图模型开始和结束日期并使用数据注释进行验证。验证规则是:开始和结束日期的数据注释

  1. 开始日期不应该大于结束日期和不为空,空
  2. 结束日期应不小于开始日期和不低于 DateTime.Now并且不为空,空

以下视图模型由startdate和enddate属性组成。混乱的是,我怎么能在下面的代码在结束日期的数据注解传递结束日期值的值StartEndDateRange数据注释和起始日期值:

public class StartEndDate 
    { 
     [DataType(DataType.Date)] 
     [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)] 
     [StartEndDateRange("2000/01/01", "value of end date properties")] 
     public DateTime StartDate { get; set; } 

     [DataType(DataType.Date)] 
     [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)] 
     [StartEndDateRange("value of startdate properties", DateTime.Now.ToString("yyyy/MM/dd"))] 
     public DateTime EndDate { get; set; } 


    } 

    public class StartEndDateRangeAttribute : ValidationAttribute 
    { 
     private const string DateFormat = "yyyy/MM/dd"; 
     private const string DefaultErrorMessage = 
    "'{0}' must be a date between {1:d} and {2:d}."; 

     public DateTime MinDate { get; set; } 
     public DateTime MaxDate { get; set; } 

     public StartEndDateRangeAttribute(string minDate, string maxDate) 
      : base(DefaultErrorMessage) 
     { 
      MinDate = ParseDate(minDate); 
      MaxDate = ParseDate(maxDate); 
     } 

     public override bool IsValid(object value) 
     { 
      if (value == null || !(value is DateTime)) 
      { 
       return true; 
      } 
      DateTime dateValue = (DateTime)value; 
      return MinDate <= dateValue && dateValue <= MaxDate; 
     } 
     public override string FormatErrorMessage(string name) 
     { 
      return String.Format(CultureInfo.CurrentCulture, 
    ErrorMessageString, 
       name, MinDate, MaxDate); 
     } 

     private static DateTime ParseDate(string dateValue) 
     { 
      return DateTime.ParseExact(dateValue, DateFormat, 
    CultureInfo.InvariantCulture); 
     } 
    } 

回答

1

它更容易实现这一个验证属性DateRange

但是,如果你不想,你就必须重写IsValid(Object, ValidationContext),提取对象类型从ValidationContext.ObjectType被验证,获得通过ValidationContext.MemberName正在验证它的属性,然后从属性的读取值。

2

创建两个不同的验证属性。一个DateBefore和另一个DataAfter

您可以从validationContext获得验证模型的属性。

DateBefore

protected override ValidationResult IsValid(object value, ValidationContext validationContext) { 
    PropertyInfo endDateProperty= validationContext.ObjectType.GetProperty("EndDate"); 
    ... 
} 

通过

var endDate = endDateProperty.GetValue(validationContext.ObjectInstance, null); 

获得的价值现在比较valueendDate

编辑

多一点代码

public class BeforeEndDateAttribute : ValidationAttribute{ 
    public string EndDatePropertyName { get; set; } 
    public string StartDate { get; set; } 


    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     PropertyInfo endDateProperty = validationContext.ObjectType.GetProperty(EndDatePropertyName); 

     DateTime endDate = (DateTime) endDateProperty.GetValue(validationContext.ObjectInstance, null); 

     var startDate = DateTime.Parse(StartDate); 

     // Do comparison 
     // return ValidationResult.Success; // if success 
     return new ValidationResult("Error"); // if fail 
    } 

} 

而且使用这样的:

public class MyModel 
{ 
    [BeforeEndDate(EndDatePropertyName = "EndDate", StartDate = "2000/01/01")] 
    public DateTime StartDate { get; set; } 

    // [AfterStartDate(StartDatePropertyName = "StartDate", EndDate = "2020/01/01")] 
    public DateTime EndDate { get; set; } 
} 
+0

谢谢我明白了。但是我必须在dataannotation中为结束日期的值放置:'[StartEndDateRange(“2000/01/01”,“结束日期属性的值”)]' – CodeManiac

+0

取代*“结束日期属性的值”*?没有。只是'[StartEndDateRange(“2000/01/01”)]'。告诉我你是否需要更多的解释。 – Mohayemin

+0

@CodeManiac:编辑 – Mohayemin

1

我可以建议你实现班上IValidatableObject但唯一的一点是你必须自己做客户端验证。

public class StartEndDate: IValidatableObject 
{ 
    [Required] 
    public DateTime StartDate { get; set; } 

    [Required]  
    public DateTime EndDate { get; set; } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     // do the validations 
    } 
} 
相关问题