我想只为字符串属性创建一个显示模板,并为所有其他属性使用default。
我尝试在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" })
这是基于“默认”模板,适用于所有类型。
答案 0 :(得分:12)
有9个内置显示模板:“Boolean”,“Decimal”,“EmailAddress”,“HiddenInput”,“Html”,“Object”,“String”,“Text”和“Url”。< / p>
查看following blog post,其中详细说明了模板的工作原理以及解决方法。以下是它的引用:
按顺序尝试以下模板名称:
- ModelMetadata的TemplateHint
- ModelMetadata的DataTypeName
- 类型的名称(见下面的注释)
- 如果对象不复杂:“String”
- 如果对象很复杂且界面:“对象”
- 如果对象很复杂而不是接口:通过继承hiearchy递归该类型,尝试每个类型名称
醇>
因此,对于DateTime和Int64,您要点第4点,因为这些类型没有默认模板。
因此,您可以使用ModelMetadata中的模板提示或数据类型名称,仅将此自定义模板用于视图模型上的给定属性。