DataAnotation用于验证模型,如何验证它以便日期不在将来?

时间:2017-09-12 20:27:09

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

我有评论模型,我正在尝试验证模型,以便 当用户选择日期时,它不能是将来的日期。

Review.cs

public class Review : BaseEntity{

    [Key]
    public int Id {get; set;}

    [Required(ErrorMessage="You need a restaurant name!")]
    public string RestaurantName {get; set;}

    [What do I put in here??]
    public DateTime Date {get; set;}


}

我是新手,documentation有点难以理解。

非常感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

您可以创建自定义验证属性,该属性执行自定义逻辑并使用它来装饰您的属性名称。

public class DateLessThanOrEqualToToday : ValidationAttribute
{
    public override string FormatErrorMessage(string name)
    {
        return "Date value should not be a future date";
    }

    protected override ValidationResult IsValid(object objValue,
                                                   ValidationContext validationContext)
    {
        var dateValue = objValue as DateTime? ?? new DateTime();

        //alter this as needed. I am doing the date comparison if the value is not null

        if (dateValue.Date > DateTime.Now.Date)
        {
           return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
        }
        return ValidationResult.Success;
    }
}

现在,在您的视图模型中,使用此新的自定义属性

修饰您的属性名称
[DateLessThanOrEqualToToday]
public DateTime Date { get; set; }

此自定义验证属性主要关注您的特定验证逻辑。您可以根据需要更改它以包括更多空检查,最小值检查等。

答案 1 :(得分:0)

您需要为此编写自定义验证程序。例如,您可以根据需要为其命名。

[DateNotInTheFuture]
public DateTime Date { get; set; }

本文详细解释了流程本身:https://msdn.microsoft.com/en-us/library/cc668224.aspx

总结:

  • 创建继承ValidationAttribute
  • 的新密封公共类
  • 在该类中实现对IsValid方法的覆盖。
  • 在IsValid方法中编写自定义验证逻辑并返回结果

答案 2 :(得分:0)

尝试自定义验证标准模型验证

第一个选项,设置属性标准数据注释验证的属性:

  • 使用errormessage属性和dateformatstring设置 DateType 属性。
  • 如果需要,请设置范围属性。
  • 在屏幕上为show label设置显示属性。

    [DataType(DataType.Date), ErrorMessage = "Please enter a correct date format dd/mm/yyyy hh:mm", DisplayFormat( DataFormatString="{0:dd/MM/yyyy}", ApplyFormatInEditMode=true )]
    [Range(typeof(DateTime), "1/1/2016", "1/1/2011")]
    [Display(Name = "My Date")]
    public DateTime Date {get; set;}
    

第二个选项,自定义验证方法

您必须扩展 ValidationAttribute 类并覆盖IsValid

public class MyDateValidation: ValidationAttribute
{
    public override bool IsValid(object value)
    {
        // check your business date property  
        DateTime myDatetime;
        bool isParsed = DateTime.TryParse((string)value, out myDatetime);
        if(!isParsed)
            return false;
        return true;
    }
}

[MyDateValidation(ErrorMessage="Your message")]
public Datetime myDate { get; set; }

有关此主题,请参阅我的其他answer