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

时间:2012-06-13 08:59:20

标签: razor asp.net-mvc-4 display-templates

我想只为字符串属性创建一个显示模板,并为所有其他属性使用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" })

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

1 个答案:

答案 0 :(得分:12)

有9个内置显示模板:“Boolean”,“Decimal”,“EmailAddress”,“HiddenInput”,“Html”,“Object”,“String”,“Text”和“Url”。< / p>

查看following blog post,其中详细说明了模板的工作原理以及解决方法。以下是它的引用:

  

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

     
      
  1. ModelMetadata的TemplateHint
  2.   
  3. ModelMetadata的DataTypeName
  4.   
  5. 类型的名称(见下面的注释)
  6.   
  7. 如果对象不复杂:“String”
  8.   
  9. 如果对象很复杂且界面:“对象”
  10.   
  11. 如果对象很复杂而不是接口:通过继承hiearchy递归该类型,尝试每个类型名称
  12.   

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

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