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

C# 如何使用DateTime.Today作为DataAnnotations.RangeAttribute中的参数,c#,asp.net-mvc,model,data-annotations,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属性参数必须是常量表达式, 属性的表达式类型或数组创建表达式 参数类型 是否有一种方法可以通过属

在其中一个模型中,我得到了如下内容:

[Required]
[Display(Name="Date of Birth")]
[Range(typeof(DateTime), DateTime.MinValue.ToString(), DateTime.Today.ToString())]
public DateTime BirthDate { get; set; }
但编译器抱怨说

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


是否有一种方法可以通过属性来实现,或者必须将其作为验证来实现

必须指定常量。静态字符串不是常量。该属性希望常量字符串而不是静态字符串


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

编写您自己的属性
PastDateAttribute
类,该类继承自
ValidationAttribute
。然后用
[PastDate]
注释属性
生日

示例实现如下所示:


谢谢你的回答。但我今天想用的不是const-DateTime。所以这意味着我必须为它编写一个验证器?这不会提供任何客户端验证属性是元数据,必须在编译时知道,所以这是不可能的。如果值基于模型中的其他特性,则需要使用自定义条件属性。例如,您可以使用
[LessThanOrEqualTo(“BaseDate”)]
,其中
BaseDate
是模型中的一个属性,设置为
DateTime.Today
或编写自己的-Reference,这意味着您可以创建
[lessthanorequaltoday]
属性,该属性在您的模型中不需要附加属性。另外请注意,您不能使用
DateTime
值获取带有
[Range]
属性的客户端,除非您按照
[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; }