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

Razor ASP.NET MVC 4仅为字符串定义显示模板,razor,asp.net-mvc-4,display-templates,Razor,Asp.net Mvc 4,Display Templates,我只想为字符串属性创建一个显示模板,并对所有其他属性使用默认值 我尝试在Views/Shared/DisplayTemplates中创建一个string.cshtml,包含以下内容: @model string @Html.TextBoxFor(m => m, new { @readonly = "readonly" }) 现在,当我尝试打开任何使用DisplayFor(m=>m.property)的视图时,我遇到了一个问题,它会显示如下错误: 传递到字典中的模型项的类型为“System

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

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

@model string
@Html.TextBoxFor(m => m, new { @readonly = "readonly" })
现在,当我尝试打开任何使用DisplayFor(m=>m.property)的视图时,我遇到了一个问题,它会显示如下错误: 传递到字典中的模型项的类型为“System.DateTime”,但此字典需要类型为“System.String”的模型项。 或: 传递到字典中的模型项的类型为“System.Int64”,但此字典需要类型为“System.String”的模型项

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

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

@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, new { @readonly = "readonly" })

这基于“默认”模板,适用于所有类型。

有9个内置显示模板:“布尔”、“十进制”、“电子邮件地址”、“HiddenInput”、“Html”、“对象”、“字符串”、“文本”和“Url”

请看一看,其中详细解释了模板如何工作以及如何解析它们。这里有一段引语:

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

  • 来自ModelMetadata的TemplateHint
  • ModelMetadata中的DataTypeName
  • 类型的名称(请参见下面的注释)
  • 如果对象不复杂:“字符串”
  • 如果对象是复杂的,并且是一个接口:“object”
  • 如果对象是复杂的,而不是接口:通过类型的继承层次结构递归,尝试每个类型名
  • 所以你达到了第四点。用于DateTime和Int64,因为这些类型没有默认模板


    因此,您可以使用ModelMetadata中的模板提示或数据类型名称,仅对视图模型上的给定属性使用此自定义模板。

    您能告诉我Object或Collection.cshtml文件在mvc源代码中的位置吗?@Maslow:源代码中没有真正的cshtml文件,html是在TagBuilder的帮助下生成的(例如,请参见)