【问题标题】:How Can I Used DateTime.Today as a Paramter in DataAnnotations.RangeAttribute [duplicate]如何使用 DateTime.Today 作为 DataAnnotations.Range 属性中的参数 [重复]
【发布时间】:2017-02-24 22:29:45
【问题描述】:

在其中一个模型中,我有这样的东西:

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

但是编译器抱怨说

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

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

【问题讨论】:

  • 属性是元数据,必须在编译时知道,所以不可能。您需要使用自定义条件属性,其中值基于模型中的其他属性。例如,您可以使用foolproof [LessThanOrEqualTo("BaseDate")] 其中BaseDate 是模型中的一个属性,并设置为DateTime.Today
  • 或者编写自己的 - 参考 The Complete Guide To Validation In ASP.NET MVC 3 - Part 2,这意味着您可以创建一个 [LessThanOrEqualToToday] 属性,该属性不需要模型中的其他属性。
  • 请注意,除非您按照this answer 修改$.validator,否则您无法使用DateTime 值获取具有[Range] 属性的客户端

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


【解决方案1】:

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

一个示例实现例如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; }

【讨论】:

  • 这不会给任何客户端验证
【解决方案2】:

您必须指定 const。静态字符串不是 const。该属性想要 const 字符串而不是静态字符串。

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

【讨论】:

  • 感谢您的回答。但我想使用不是 const 的东西 - DateTime.Today。所以这意味着我必须为它写一个验证器?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-16
  • 2015-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多