【发布时间】:2011-09-17 07:27:02
【问题描述】:
我的 ViewModel 中有一个 DateTime MyDate 类型的属性。我想确保用户仅以特定格式(dd.mm.yyyy)在文本框中输入日期部分并尝试了以下属性:
[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 帮助程序都按预期工作
- 两个助手的服务器端验证总是失败,即使像“17.06.2011”这样通过正则表达式的有效日期也是如此。
MyDate属性已正确填充viewModel中输入的日期,该日期已传递给操作。所以看起来模型绑定是有效的。 -
DisplayFormat属性仅受EditorFor尊重,但不受TextBoxFor尊重。TextBoxFor显示“dd.mm.yyyy hh:mm:ss”
问题:
我可以在不是
string的属性上应用RegularExpressionAttribute吗?如果允许,reg ex 如何在服务器端评估非字符串属性,如DateTime?与 reg ex 相比,MyDate.ToString()之类的东西吗? (它会解释验证失败,因为 ToString 将返回一个包含不通过正则表达式的时间部分的字符串。)DisplayFormat属性是否通常只被EditorFor尊重,而从不被TextBoxFor尊重?如何正确进行日期验证?
【问题讨论】:
标签: asp.net asp.net-mvc validation asp.net-mvc-3