ASP.NET MVC 4仅为字符串定义显示模板

Gor*_*vic 9 razor display-templates asp.net-mvc-4

我想只为字符串属性创建一个显示模板,并为所有其他属性使用default.

我试图在Views/Shared/DisplayTemplates中创建一个string.cshtml,其中包含以下内容:

@model string
@Html.TextBoxFor(m => m, new { @readonly = "readonly" })
Run Code Online (Sandbox Code Playgroud)

我现在有一个问题,当我尝试打开任何使用DisplayFor(m => m.property)的视图时,它显示如下错误:传递到字典中的模型项是'System.DateTime'类型,但是这个字典需要一个'System.String'类型的模型项.或:传递到字典中的模型项的类型为"System.Int64",但此字典需要"System.String"类型的模型项.

我知道我可以通过为每种使用的类型添加显示模板来解决这个问题,但我想对于没有定义自定义模板的所有类型,我也可以使用"默认"模板吗?

更新 Darin的回答后,我检查了Brad的教程并将模板更改为:

@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, new { @readonly = "readonly" })
Run Code Online (Sandbox Code Playgroud)

这基于"默认"模板,适用于所有类型.

Dar*_*rov 12

有9个内置显示模板:"Boolean","Decimal","EmailAddress","HiddenInput","Html","Object","String","Text"和"Url".

请查看以下博客文章,其中详细说明了模板如何工作以及如何解决这些问题.以下是它的引用:

按顺序尝试以下模板名称:

  1. 来自ModelMetadata的TemplateHint
  2. ModelMetadata中的DataTypeName
  3. 类型的名称(见下面的注释)
  4. 如果对象不复杂:"String"
  5. 如果对象很复杂并且有一个接口:"对象"
  6. 如果对象很复杂而不是接口:通过继承hiearchy递归类型,尝试每个类型名称

因此,对于DateTime和Int64,您要点第4点,因为这些类型没有默认模板.

因此,您可以使用ModelMetadata中的模板提示或DataType名称仅将此自定义模板用于视图模型上的给定属性.