4

我正在使用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 编辑器的东西):

日期编辑器 mvc4

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

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

4

1 回答 1

14

MVC4中,使用的模板由 确定:

  1. 如果UIHintAttribute有的话
  2. 如果DataTypeAttribute有的话
  3. 物业类型

MVC3中,DataTypeAttribute未使用。

您的财产有

[DataType(DataType.Date)]

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

您有两种选择来解决您的问题:

  1. UIHint("String")在您的财产上添加一个,或
  2. 将您的编辑器模板从 重命名String.cshtmlDate.cshtml
于 2013-01-18T14:48:50.877 回答