【问题标题】:How to validate that a date is in the past using Model Binding validation in Razor Page如何使用 Razor 页面中的模型绑定验证来验证日期是否过去
【发布时间】:2021-04-14 10:42:21
【问题描述】:

抱歉,如果这是一个愚蠢的问题 - 我是 Razor 页面和 ASP.Net Core 的新手。

我有一个页面设置了数据绑定和模型上定义的各种属性,以提供一些基本的客户端验证,它们工作正常,但是我有一个日期字段,我需要确保它没有被设置为未来日期。

我知道如何验证日期是否为过去 - 这不是问题 - 但我希望能够验证日期并在字段下方的范围内显示错误消息,就像在必填字段时一样丢失、长度错误等。

我假设我可以按照以下方式向模型上的属性添加一些属性

        [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}, ApplyFormatInEditMode = true)")]
        [Range(typeof(DateTime), "01/01/1980", DateTime.Today.ToString(),  ErrorMessage = "Value must be in the past")]
        public DateTime Date { get; set; }

但我得到一个错误,大意是我只能使用常量(我担心会出现这种情况)。

接下来,我查看了是否可以在代码中使该字段无效,但我不知道您将如何做到这一点,而且我无法在任何地方找到可比较的示例。我想我可以在页面的 ModelState 中添加一个错误,但我看不到如何。

正如我所说,我可以想到很多其他的验证方式,但我希望验证错误的一致性能够以与其他属性驱动的验证相同的方式呈现。

感谢您的帮助。

【问题讨论】:

    标签: c# validation asp.net-core razor model-binding


    【解决方案1】:

    好的...找到(a)解决方案...

    我创建了一个自定义验证方法

    public class CustomValidationMethods
        {
            public static ValidationResult PastDate(DateTime date)
            {
                return DateTime.Compare(date, DateTime.Today) > 0 ? new ValidationResult("Date cannot be in the future") : ValidationResult.Success;
            }
        }
    

    并将其添加到模型定义中

            [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")]
            [CustomValidation(typeof(CustomValidationMethods), nameof(CustomValidationMethods.PastDate))]
            public DateTime Date { get; set; }
    

    我不知道这是否是最好的答案,但它有效并且对我来说很有意义。

    【讨论】:

    • 这仅适用于服务器端 =)) 您需要实施自定义客户端验证以获得完美的自定义验证解决方案,请查看docs.microsoft.com/en-us/aspnet/core/mvc/models/…
    • 感谢@King 的注释-我明白你的意思,但就我的目的而言,服务器端验证现在还可以:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 2011-09-16
    • 1970-01-01
    相关资源
    最近更新 更多