我在ViewModel中拥有DateTime MyDate
类型的属性。我想,以确保用户只输入在一个特定的格式(DD.MM.YYYY)文本框的日期部分,并试图以下属性:在ASP.NET MVC中以特定格式验证日期3
[DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode=true)]
[RegularExpression(@"^(([0-2]\d|[3][0-1])\.([0]\d|[1][0-2])\.[2][0]\d{2})$",
ErrorMessage="Failed...")]
public DateTime MyDate { get; set; }
的控制器动作签名HttpPost样子这样的:
[HttpPost]
public ActionResult Edit(int id, MyViewModel viewModel)
{
// MyViewModel contains the MyDate property ...
// ...
if (ModelState.IsValid)
{
// ...
}
// ...
}
在Razor视图我尝试以下两种方式:
@Html.TextBoxFor(model => model.MyDate)
@Html.EditorFor(model => model.MyDate)
它不工作,我想。其结果是:
- 客户端验证工作与两个HTML辅助
- 服务器端验证总是失败两个帮手预期,即使像“2011年6月17日”,它通过正则表达式的有效日期。
MyDate
属性填写正确,输入日期为viewModel
,并传递给操作。所以看起来,模型绑定工作。 DisplayFormat
属性仅受到EditorFor
的尊重,但不受TextBoxFor
的尊重。TextBoxFor
显示 “DD.MM.YYYY HH:MM:SS”
问题:
我可以申请一个
RegularExpressionAttribute
在所有上这不是一个string
的属性?如果允许在服务器端如何评估reg ex等非字符串属性(如DateTime
)?是否像MyDate.ToString()
与reg ex相比? (这可以解释的是,验证失败,因为的ToString将返回一个字符串,包括其不通过正则表达式的时间部分。)是在
DisplayFormat
属性一般只能通过EditorFor
从不推崇的TextBoxFor
?我该如何进行日期验证?
感谢您的链接,我已将其加入书签以供将来参考。但是:我认为我的问题与本地化没有任何关系。我不相信正则表达式会被忽略:客户端验证工作和服务器端验证也会对reg ex进行一些操作(它违背了这个reg ex,就像ModelState所说的那样)。我测试开发机器(客户端和服务器=相同的机器),所以语言环境是相同的。但我同时也相信,使用reg ex是错误的(虽然没有忽略)。你如何验证用户只输入没有时间部分的日期? – Slauma
@Slauma,你在同一台机器上试过这个事实并不意味着浏览器和服务器的文化设置没有差异。就时间部分而言,我只是告诉用户他需要输入日期的格式,而在服务器上,如果我的应用程序不需要它,我会简单地忽略时间部分。甚至可能提供一个jQuery日期选择器来简化用户输入正确格式的日期。 –
你说得对,我想它太复杂了。现在作为一个额外的帮助用户输入,我创建了一个'DateOnly'属性(请参阅我自己的答案)。日期选择器对用户来说是更好的帮助!我会尝试将其作为下一步之一。 – Slauma