【问题标题】:DataAnotation to validate a model, how do I validate it so that the date is not in the future?用于验证模型的数据注释,我如何验证它以使日期不在未来?
【发布时间】:2017-09-12 20:27:09
【问题描述】:

我有审查模型,我正在尝试验证模型,以便 当用户选择一个日期时,它不能是未来的日期。

评论.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 有点难以理解。

非常感谢您提前提供的帮助。

【问题讨论】:

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


【解决方案1】:

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

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

此自定义验证属性主要关注您的特定验证逻辑。您可以根据需要对其进行更改以包含更多空检查、最小值检查等。

【讨论】:

  • 非常感谢您的详细回答。我要在 Review.cs 文件中创建这个类吗??
  • 我会创建一个单独的类并将其保存在“CustomValidations”之类的文件夹下以提高可读性
【解决方案2】:

尝试自定义验证标准模型验证与属性。

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

  • 使用错误消息属性和日期格式字符串设置 DateType 属性。
  • 根据需要设置范围属性。
  • 为屏幕上的显示标签设置Display属性。

    [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 关于这个主题。

【讨论】:

  • [Range(typeof(DateTime), "1/1/2016", "1/1/2011")]“1/1/2016”和“1/1/2011”的格式是什么? MM/dd/yyyy 还是 dd/MM/yyyy?谢谢
【解决方案3】:

您需要为此编写一个自定义验证器。例如,您可以随意命名。

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

流程本身在这篇文章中有详细解释:https://msdn.microsoft.com/en-us/library/cc668224.aspx

总结:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 2015-12-14
    相关资源
    最近更新 更多