范围限制属性,DateTime

时间:2014-01-27 13:58:16

标签: c# asp.net-mvc-4 datetime

我正在尝试基于给定日期值的一系列值进行限制,使用:

[Range(typeof(DateTime), "1/1/1971", DateTime.Now.AddDays(1).ToString())]
public DateTime date { get; set; }

但是,我得到一个错误,说我不能将变量用于该限制。我怎么能实现这一点呢?

提前致谢!

2 个答案:

答案 0 :(得分:1)

由于Attributes期望值为常量,因此您必须实现自定义元数据提供程序。然后,您将动态地注入范围的结束值。

public class CustomModelMetadataProvider : DataAnnotationsModelMetadataProvider
{
     protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName)
     {
          base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);

          foreach (var attribute in attributes.OfType<RangeAttribute>())
          {
               if (attribute.OperandType == typeof(DateTime)
               {
                    attribute.Maximum = DateTime.Now.AddDays(1).ToString();
               }
          }
     }
}

另一个选项,如Abbas的回答中所建议的那样,是创建一个自定义验证属性。这些方面的东西:

public class CustomDateRangeAttribute : RangeAttribute
{
     public CustomDateRangeAttribute()
     {
          base();
          base.Maximum = DateTime.Now.AddDays(1).ToString();
     }
}

答案 1 :(得分:0)

虽然未在RangeAttribute ClassRangeAttribute Constructor (Type, String, String)文档中指定,但构造函数需要常量值。