如何在使用`String`而不是`Date`类型时验证日期?

时间:2011-02-02 22:22:47

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

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

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

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

业务要求是该字段,但如果该字段中存在某些内容,那么它必须是有效日期。

如何实现此要求而不更改数据类型

4 个答案:

答案 0 :(得分:8)

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 :(得分:6)

public string Registrationdate { 
    get; 
    set {
        DateTime date;
        var isDate = DateTime.TryParse(value, out date);
        if (isDate) { 
            _registrationDate = value; 
        }
        else {
          // Throw exception
        }
    }
}

答案 2 :(得分:1)

(有点)伪代码:

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

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

答案 3 :(得分:0)

正则表达式怎么样? Data Annotations具有regex属性。现在你必须修改一个格式,比如ISO(yyyy / mm / dd)可能不符合你的要求。

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

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

西蒙