【问题标题】:How to validate date when using `String` instead of a `Date` type?使用`String`而不是`Date`类型时如何验证日期?
【发布时间】:2011-06-20 07:37:38
【问题描述】:

在一个 Asp.net MVC 应用程序中,我继承了这个问题(如果这是一个问题?),其中一位开发人员使用 String 作为日期类型。

在我的模型中,该属性为:

[Required]
[DisplayName("Registration Date")]
public string Registrationdate { get; set; }

业务要求是该字段是必需的,但如果该字段中有内容,则它必须是有效日期。

在不改变数据类型的情况下,您将如何实现这一要求

【问题讨论】:

  • 可能会在 setter 方法中使用 DateTime.TryParse 实现检查

标签: c# asp.net asp.net-mvc asp.net-mvc-2 types


【解决方案1】:
public string Registrationdate { 
    get; 
    set {
        DateTime date;
        var isDate = DateTime.TryParse(value, out date);
        if (isDate) { 
            _registrationDate = value; 
        }
        else {
          // Throw exception
        }
    }
}

【讨论】:

  • 好的,谢谢,这不是一个坏方法。但是如何在 MVC 应用程序中将其显示为验证错误? +1
【解决方案2】:

(某种)伪代码:

if (Registrationdate is not empty)
{
    RegistrationDateTime = new DateTime(Registrationdate);

    if (RegistrationDateTime is not valid DateTime)
        fail validation;
}

【讨论】:

    【解决方案3】:

    It looks like you're 使用 System.ComponentModel.DataAnnotations。使用此库执行此操作的最佳方法是创建一个新属性来验证日期字符串并将其应用于属性。下面是一些代码供您开始:

    [AttributeUsage(AttributeTargets.Property, Inherited = true)]
    class DateAttribute : ValidationAttribute
    {
        public override bool IsValid(object value)
        {
            var dateString = value as string;
            if (string.IsNullOrWhiteSpace(dateString))
            {
                return true; // Not our problem
            }
            DateTime result;
            var success = DateTime.TryParse(dateString, out result);
            return success;
        }
    }
    

    您可能需要扩展此代码,具体取决于您期望从客户端获得的字符串类型。此外,这不会为您提供任何客户端验证。

    【讨论】:

    • +1:你是绝对正确的,我正在使用 DataAnnotations 并且希望有类似这种类型的解决方案。我今晚要试试这个。
    【解决方案4】:

    正则表达式怎么样?数据注释有一个正则表达式属性。现在您必须修正一种格式,例如 ISO (yyyy/mm/dd),它可能不符合您的要求。

    另一种选择可能是创建自己的注释。

    另一种解决方案可以使用可为空的日期时间(DateTime?)。我不确定如何处理,所以需要一些试验和错误。然而,它只需要添加一个?所以可能相对容易尝试。

    西蒙

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-31
      • 2019-06-27
      • 1970-01-01
      • 2016-09-26
      相关资源
      最近更新 更多