自定义EditorTemplate未在MVC4中用于DataType.Date

时间:2012-12-18 01:47:21

标签: asp.net-mvc asp.net-mvc-4

我正在使用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验证完成的,不引人注目。无论如何,这是它以前呈现的方式:

date editor

现在我正在使用MVC4,不再为此属性调用String.cshtml编辑器模板。它呈现如下(在Chrome中使用HTML5编辑器的东西,我假设):

date editor mvc4

input元素看起来几乎相同 - 所有jQuery验证位都在那里 - 唯一的区别似乎是type属性现在是type="date",之前它是type="text"

我想继续使用String.cshtml EditorTemplate来获取此数据类型。我想可能有一个数据注释我可以放在ViewModel属性上为@Html.EditorFor(...)提供TemplateHint。如果不是这样,我想知道我可以编写的自定义EditorTemplate来劫持MVC4的格式(我已经尝试DateTime.cshtml - 它也没有被调用)。如果不是其中任何一个,那么我愿意接受有关如何使我的属性呈现的建议​​。

1 个答案:

答案 0 :(得分:13)

MVC4中,使用的模板由以下内容决定:

  1. UIHintAttribute(如果有)
  2. DataTypeAttribute(如果有)
  3. 属性的类型
  4. MVC3中,未使用DataTypeAttribute

    您的财产有

    [DataType(DataType.Date)]
    

    因此使用了模板Date.cshtml。如果它不存在,则执行默认渲染。

    您有两种方法可以解决您的问题:

    1. 在您的媒体资源上添加UIHint("String"),或
    2. 将您的编辑器模板从String.cshtml重命名为Date.cshtml