9

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

我尝试在 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”类型的模型项。

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

更新 达林回答后,我检查了布拉德的教程并将模板更改为:

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

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

4

1 回答 1

12

有 9 个内置显示模板:“Boolean”、“Decimal”、“EmailAddress”、“HiddenInput”、“Html”、“Object”、“String”、“Text”和“Url”。

请查看以下博客文章,其中详细解释了模板的工作原理以及它们是如何解决的。这是它的引述:

依次尝试以下模板名称:

  1. 来自模型元数据的模板提示
  2. 来自 ModelMetadata 的 DataTypeName
  3. 类型的名称(见下面的注释)
  4. 如果对象不复杂:“字符串”
  5. 如果对象是复杂的和接口:“对象”
  6. 如果对象很复杂而不是接口:通过类型的继承层次递归,尝试每个类型名称

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

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

于 2012-06-13T09:23:41.100 回答