在ASP.NET MVC 4应用我有一个包含一个可为空TimeSpan
属性视图模型:显示验证错误时时间跨度模型结合发生异常
[DisplayName("My time")]
public TimeSpan? MyTime { get; set; }
它被绑定到视图的输入元件:
@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 })
012:
@Html.EditorFor(model => model.MyTime)
输入框获取具有自定义编辑模板TimeSpan.cshtml
的帮助下呈现
现在,如果我输入了以下2种无效时间和提交页面我得到的模型绑定以下不同的行为:
如果我输入一个字母,说
"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."
。
我该如何解决这个问题?
编辑
自定义验证属性显然不帮助,因为它不要求时的实例已经模型绑定检测无效值以上无效的输入。我曾尝试过这种方法,但没有成功。
创建一个模型联编程序(我不太熟悉)并尝试使用代码的想法指出了我正确的方向,尽管我最终采用了不同的方式(请参阅我自己的答案)。我学到了一些新东西。谢谢! – Slauma 2013-05-10 18:06:24