我如何使用DateTime.Today作为DataAnnotations.RangeAttribute中的参数

时间:2017-02-24 22:29:46

标签: c# asp.net-mvc model data-annotations

在其中一个模型中,我有类似的东西:

[Required]
[Display(Name="Date of Birth")]
[Range(typeof(DateTime), DateTime.MinValue.ToString(), DateTime.Today.ToString())]
public DateTime BirthDate { get; set; }

但是编译器抱怨

  

错误CS0182属性参数必须是常量表达式,   typeof表达式或数组创建表达式的属性   参数类型

有没有办法可以通过属性来实现,还是必须将其作为验证来实现?

2 个答案:

答案 0 :(得分:1)

编写自己继承自PastDateAttribute的属性ValidationAttribute类。然后使用BirthDate注释属性[PastDate]

示例实现例如是here

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
public class PastDateAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext context)
    {
        DateTime? dateValue = value as DateTime?;
        var memberNames = new List<string>() {context.MemberName};

        if (dateValue != null)
        {
            if (dateValue.Value.Date > DateTime.UtcNow.Date)
            {
                return new ValidationResult(Resources.PastDateValidationMessage, memberNames);
            }
        }

        return ValidationResult.Success;
    }
}

用法:

[Required]
[Display(Name="Date of Birth")]
[PastDate]
public DateTime BirthDate { get; set; }

答案 1 :(得分:0)

您必须指定const。静态字符串不是const。该属性希望const字符串不是静态字符串。

为了获得最佳实践,请创建一个类并添加const dateMinValue和dateMaxvalue。或者您可以手动添加“0001年1月1日星期一”。但我更喜欢静态类,并添加像const字符串,它更容易。