2010-01-19 62 views
1

让说我有以下类:净 - DataAnnotations - 验证2依赖的DateTime

public class Post 
{ 
    public Date BeginDate { get; set; } 

    [Validate2Date(BeginDate, EndDate, ErrorMessage = "End date have to occurs after Begin Date")] 
    public Date EndDate { get; set; } 
} 

public class Validate2Dates : ValidationAttribute 
{ 
    public Validate2Dates(DateTime a, DateTime b) 
    { ... } 

    public override bool IsValid(object value) 
    { 
     // Compare date and return false if b < a 
    } 
} 

我的问题是如何利用我的自定义属性Validate2Dates因为我不能做到这一点:

[Validate2Date(BeginDate, EndDate, ErrorMessage = "End date have to occurs before Begin Date")] 

我得到了以下错误:

An object reference is required for the non-static field, method, or property '...Post.BeginDate.get' C:...\Post.cs

回答

0

不能使用这样的属性。属性参数被限制为常量值。

Imo更好的解决方案是提供一个方法在你的类上实现这个检查,并且可以通过你喜欢的业务逻辑验证接口调用。

+0

完全不同意。你不能使用上面写的验证属性,这是正确的。然而,他试图解决的问题是使用验证属性完美解决的。我认为,您认为将验证逻辑本身放入可重用组件中是有意义的,然后您可以在验证属性中利用该组件,并将其插入其余数据注释和模型绑定中机械。 – nerraga 2010-12-23 16:26:09

0

答案是肯定的,你可以做你想做的事情,而不是你现在正在做的事情。 (顺便说一句,我只注意到这个question已经回答得非常好已经,所以我想我会至少下降一个快速的参考吧。)

基于上面的链接...

  1. 你“会需要编写一个自定义验证(你已经做了)
  2. 你需要在水平来装饰你的模式,而不是财产水平
  3. 你不会使用属性本身被作为参数 - 而只是将它们作为字符串引用来查找vi反射

[Validate2Date(BeginDate, EndDate, ...

变得

[Validate2Date(StartDate = "BeginDate", EndDate = "EndDate", ...

随即会重写的IsValid()和反映在必要的属性来执行比较。 From the link

.... 
     var properties = TypeDescriptor.GetProperties(value); 
     object originalValue = properties.Find(OriginalProperty, true /* ignoreCase */).GetValue(value); 
     object confirmValue = properties.Find(ConfirmProperty, true /* ignoreCase */).GetValue(value); 
     return Object.Equals(originalValue, confirmValue); 
....