【发布时间】:2013-05-04 17:34:51
【问题描述】:
在 ASP.NET MVC 4 应用程序中,我有一个视图模型,其中包含一个可为空的 TimeSpan 属性:
[DisplayName("My time")]
public TimeSpan? MyTime { get; set; }
它绑定到视图中的输入元素:
@Html.EditorFor(model => model.MyTime)
输入框在自定义编辑器模板TimeSpan.cshtml的帮助下呈现:
@model Nullable<System.TimeSpan>
@Html.TextBox("", (Model.HasValue
? Model.Value.ToString(@"hh\:mm") : string.Empty),
new { @class = "text-box single-line hasTimepicker" data_timepicker = true })
现在,如果我输入以下两种无效时间并提交页面,我会得到模型绑定器的以下不同行为:
-
如果我输入一个字母,在输入元素中说
"a",当我深入到ModelState.Values集合时,此属性的ModelError将ErrorMessage属性设置为一条消息("The value \"a\" for \"My time\" is invalid.") 和Exception属性为null。MyTime的绑定值为null。此
ErrorMessage显示在页面的验证摘要中。 -
如果我在输入元素中输入了无效时间(例如
"25:12"),则此属性的ModelError会将ErrorMessage属性设置为空字符串,但将Exception属性设置为 @ 类型的异常987654340@ 带有OverflowException类型的内部异常,告诉我无法分析TimeSpan,因为其中一个数字组件超出了有效范围。MyTime的绑定值为null。同样,
ErrorMessage显示在页面的验证摘要中。但是因为它是空的,所以不是很有用。
理想情况下,对于无效输入的第二种情况,我希望得到与第一种情况相同的错误消息,例如"The value \"25:12\" for \"My time\" is invalid."。
我该如何解决这个问题?
编辑
自定义验证属性显然在这里没有帮助,因为当模型绑定器已经检测到无效值时,不会为上述示例中的无效输入调用它。我曾尝试过这种方法但没有成功。
【问题讨论】:
标签: asp.net asp.net-mvc validation asp.net-mvc-4 model-binding