在我们的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)?
答案 0 :(得分:1)
达林的解决方案当然有效,但它不是唯一可以使用的解决方案。并且它需要你编写比我将在这里向你展示的这个解决方案更复杂的代码。
所以这是另一种选择。我建议您不要创建自定义模型绑定器,而是创建一个单独的视图模型类,而不是将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")
};
}
}
稍微调整一下,您可以从ViewUser
类继承User
并在new
上使用DateOfBirth
关键字,并使用base
属性存储正确的类型值。在这种情况下,您不需要ToPoco
方法。
注意:您必须使用
DateTime.TryParseExact
方法来解析日期,因为它们可能包含时间,也可能不包括。我没有在我的代码中包含它,因为它取决于日期输入的确切要求。
答案 1 :(得分:0)
您可以编写一个自定义模型绑定器,它将使用您在DisplayFormat属性中指定的确切格式。我已经展示了如何在this post
中实现这一目标的示例。
也不要混淆认为DisplayFormat属性会覆盖Required属性。 DisplayFormat仅用于在输入字段中显示字段。 它不是验证属性。它与验证完全无关,当表单被POST到服务器时,它永远不会被使用。