2

在我们的 ASP.NET MVC 4 应用程序中,其中一个模型具有 DateTime 类型的字段。通过表单编辑此类模型对象时,DateTime 字段的值必须为非空且格式为yyyy-MM-dd H:mm:ss(例如,2012-10-17 10:49:00)。如何确保在应用程序中正确验证此字段?我尝试了以下注释:

[System.ComponentModel.DataAnnotations.Required]
[System.ComponentModel.DataAnnotations.DisplayFormat(DataFormatString="yyyy-MM-dd H:mm:ss",
        ApplyFormatInEditMode=true)]

但是,表单数据的验证并不需要格式的所有组件都存在。例如,接受值“2012-10-17”(省略“H:mm:ss”部分)。刚刚验证该字段包含有效的 DateTime 字符串。

我应该如何确保这个 DateTime 字段确实是我指定的格式(yyyy-MM-dd H:mm:ss)?

4

2 回答 2

1

替代解决方案 - 仅查看模型类

Darin 的解决方案当然是有效的,但它不是您唯一可以使用的解决方案。它需要您编写比我将在此处向您展示的解决方案更复杂的代码。

所以这是一个替代方案。我建议您不要创建自定义模型绑定器,而是创建一个单独的视图模型类,而不是DateTime采用string您可以根据需要设置为复杂验证正则表达式的位置。然后有一个方法可以将其转换为您的应用程序/域模型类实例(并返回)。

// suppose this app model
public class User
{
    [Required]
    public string Name { get; set; }

    [Required]
    public DateTime DateOfBirth { get; set; }
}

public class ViewUser
{
    [Required]
    public string Name { get; set; }

    [Required]
    [RegularExpression("\d{4}-\d{2}-\d{2}(?:\s\d{1,2}:\d{2}:\d{2})?")]
    public string DateOfBirth { get; set; }

    public ViewUser(User user)
    {
        this.Name = user.Name;
        this.DateOfBirth = user.DateOfBirth.ToString("yyyy-MM-dd H:mm:ss");
    }

    public User ToPoco()
    {
        return new User {
            Name = this.Name,
            DateOfBirth = DateTime.Parse(this.DateOfBirth, "yyyy-MM-dd H:mm:ss")
        };
    }
}

通过一些调整,您可以ViewUserUser类继承并使用new关键字 onDateOfBirth并使用base属性来存储正确的类型值。在这种情况下,您将不需要该ToPoco方法。

注意:您将不得不使用DateTime.TryParseExact方法来解析您的日期,因为它们可能包含时间,也可能不包含时间。我没有在我的代码中包含它,因为它取决于您的日期输入的确切要求。

于 2012-10-17T10:00:01.393 回答
0

您可以编写一个自定义模型绑定器,它将使用您在 DisplayFormat 属性中指定的确切格式。我已经展示了如何在this post.

也不要误以为 DisplayFormat 属性会覆盖 Required 属性。DisplayFormat 仅用于显示输入字段中的字段。它不是验证属性。它与验证完全无关,当表单被发布到服务器时,它永远不会被使用。

于 2012-10-17T09:27:02.457 回答