1

假设我有以下课程:

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")]

我收到以下错误:

非静态字段、方法或属性 '...Post.BeginDate.get' C:...\Post.cs 需要对象引用

4

2 回答 2

0

你不能使用这样的属性。属性参数仅限于常量值。

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

于 2010-01-19T06:45:16.703 回答
0

答案是肯定的,你可以做你想做的事,而不是你现在做的事情。(顺便说一句,我刚刚注意到这个问题已经得到了很好的回答,所以我想我至少会放弃对它的快速参考。)

根据上面的链接...

  1. 您需要编写一个自定义验证器(您已经完成了)
  2. 您需要在级别而不是属性级别装饰您的模型
  3. 您不会将属性本身用作参数 - 相反,您只需将它们作为要通过反射查找的字符串来引用

[Validate2Date(BeginDate, EndDate, ...

变成

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

然后,您将覆盖 IsValid() 并反映执行比较所需的属性。从链接

.... 
        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);
....
于 2010-12-23T16:20:29.807 回答