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".
请查看以下博客文章,其中详细说明了模板如何工作以及如何解决这些问题.以下是它的引用:
按顺序尝试以下模板名称:
- 来自ModelMetadata的TemplateHint
- ModelMetadata中的DataTypeName
- 类型的名称(见下面的注释)
- 如果对象不复杂:"String"
- 如果对象很复杂并且有一个接口:"对象"
- 如果对象很复杂而不是接口:通过继承hiearchy递归类型,尝试每个类型名称
因此,对于DateTime和Int64,您要点第4点,因为这些类型没有默认模板.
因此,您可以使用ModelMetadata中的模板提示或DataType名称仅将此自定义模板用于视图模型上的给定属性.