我正在使用instructions from Microsoft将MVC3应用程序升级到MVC4。一切都进行得相当顺利 - 除了我的几个日期模型属性现在渲染方式不同。例如,其中一个属性在viewmodel中定义,如下所示:
[Required(ErrorMessage = "Required")]
[DataType(DataType.Date)]
[RegularExpression(@"([1-9]|0[1-9]|1[012])...",
ErrorMessage = "Format is mm/dd/yyyy")]
[FormatHint("mm/dd/yyyy")]
[InputSize("small")]
public string Date { get; set; }
在升级到MVC4之前,这将通过调用@Html.EditorFor(m => m.Date)
来呈现,这将使用自定义的EditorTemplate - String.cshtml
模板(因为它是一个字符串!)。我有一些格式化html的自定义数据注释,因此它在客户端使用了字段布局,jQueryUI和twitter Bootstrap。验证是通过jquery验证完成的,不引人注目。无论如何,这是它以前呈现的方式:
现在我正在使用MVC4,不再为此属性调用String.cshtml
编辑器模板。它呈现如下(在Chrome中使用HTML5编辑器的东西,我假设):
input
元素看起来几乎相同 - 所有jQuery验证位都在那里 - 唯一的区别似乎是type
属性现在是type="date"
,之前它是type="text"
。
我想继续使用String.cshtml
EditorTemplate来获取此数据类型。我想可能有一个数据注释我可以放在ViewModel属性上为@Html.EditorFor(...)
提供TemplateHint。如果不是这样,我想知道我可以编写的自定义EditorTemplate来劫持MVC4的格式(我已经尝试DateTime.cshtml
- 它也没有被调用)。如果不是其中任何一个,那么我愿意接受有关如何使我的属性呈现的建议。
答案 0 :(得分:13)
在MVC4
中,使用的模板由以下内容决定:
UIHintAttribute
(如果有)DataTypeAttribute
(如果有)在MVC3
中,未使用DataTypeAttribute
。
您的财产有
[DataType(DataType.Date)]
因此使用了模板Date.cshtml
。如果它不存在,则执行默认渲染。
您有两种方法可以解决您的问题:
UIHint("String")
,或String.cshtml
重命名为Date.cshtml