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; }