【问题标题】:mvc-model date range annotation dynamic datesmvc-model 日期范围注释动态日期
【发布时间】:2023-03-11 23:30:01
【问题描述】:

参考stackoverflow中的这个线程

[Range(typeof(DateTime), "1/2/2004", "3/4/2004",
    ErrorMessage = "Value for {0} must be between {1} and {2}")]
public DateTime EventOccurDate{get;set;}

我尝试将一些动态日期添加到我的模型的日期范围验证器中:

private string currdate=DateTime.Now.ToString();
private string futuredate=DateTime.Now.AddMonths(6).ToString();

[Range(typeof(DateTime),currdate,futuredate,
    ErrorMessage = "Value for {0} must be between {1} and {2}")]
public DateTime EventOccurDate{get;set;}

但出现错误。MVC中没有办法设置动态日期范围验证吗?

【问题讨论】:

  • 你不能。验证属性只接受静态值/常量。
  • 一个选项是在模型中包含其他 DateTime 属性(用于最小值和最大值)并使用 foolproof [GreaterThan][LessThan] 验证属性
  • 万无一失很有用..谢谢

标签: c# asp.net-mvc validation date


【解决方案1】:

您不能在属性中使用动态值,因为它们是在编译时生成的元数据。实现此目的的一种可能性是编写自定义验证属性或使用Fluent Validation,它允许使用流畅的表达式表达更复杂的验证场景。

以下是此类自定义验证属性的示例:

public class MyValidationAttribute: ValidationAttribute
{
    public MyValidationAttribute(int monthsSpan)
    {
        this.MonthsSpan = monthsSpan;
    }

    public int MonthsSpan { get; private set; }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value != null)
        {
            var date = (DateTime)value;
            var now = DateTime.Now;
            var futureDate = now.AddMonths(this.MonthsSpan);

            if (now <= date && date < futureDate)
            {
                return null;
            }
        }

        return new ValidationResult(this.FormatErrorMessage(this.ErrorMessage));
    }
}

然后用它装饰你的模型:

[MyValidation(6)]
public DateTime EventOccurDate { get; set; }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多