在 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"
请在输入元素中说ModelError
,当我钻入ModelState.Values
集合时,该属性的ErrorMessage
属性设置为消息 ("The value \"a\" for \"My time\" is invalid."
),Exception
属性为null
.MyTime
的界值为null
。这
ErrorMessage
显示在页面的验证摘要中。"25:12"
如果我在输入元素中输入了一个无效时间,比如说,ModelError
这个属性的ErrorMessage
属性设置为一个空字符串,但该Exception
属性设置为一个类型的异常,一个类型InvalidOperationException
的内部异常OverflowException
告诉我TimeSpan
无法分析,因为其中一个其数值成分超出有效范围。MyTime
的界值为null
。同样,
ErrorMessage
显示在页面的验证摘要中。但是因为它是空的,所以它不是很有用。
理想情况下,对于无效输入的第二种情况,我希望有与第一种情况相同的错误消息,例如"The value \"25:12\" for \"My time\" is invalid."
.
我怎么解决这个问题?
编辑
自定义验证属性显然在这里没有帮助,因为当模型绑定器已经检测到无效值时,不会为上述示例中的无效输入调用它。我曾尝试过这种方法但没有成功。