【问题标题】:.Net - DataAnnotations - Validate 2 dependent DateTime.Net - DataAnnotations - 验证 2 个依赖日期时间
【发布时间】:2010-01-19 01:27:25
【问题描述】:

假设我有以下课程:

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

【问题讨论】:

    标签: c# validation .net-3.5 data-annotations


    【解决方案1】:

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

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

    【讨论】:

    • 完全不同意。您不能像上面写的那样专门使用验证属性,这是正确的。然而,他试图解决的问题是使用验证属性完美解决的。我相信你是对的,因为将验证逻辑本身滚动到可重用组件中是有意义的,然后你可以在验证属性中利用该组件并将其插入到其余的数据注释和模型绑定中机械。
    【解决方案2】:

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

    根据上面的链接...

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

    [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);
    ....
    

    【讨论】:

      猜你喜欢
      • 2017-06-27
      • 2011-02-20
      • 1970-01-01
      • 1970-01-01
      • 2012-10-28
      • 2013-04-05
      • 1970-01-01
      • 1970-01-01
      • 2020-01-18
      相关资源
      最近更新 更多