据我理解
给定视图模型
public class MyViewModel{
public DateTime Date {get; set;}
public MyClass Class {get; set;}
}
.. a View Views \ MyController \ MyAction.cshtml
@model MyViewModel
@Html.DisplayForModel()
..部分View Views \ Shared \ DisplayTemplates \ DateTime.chstml
@model DateTime
Some Date
..另一部分View Views \ Shared \ DisplayTemplates \ MyClass.cshtml
@model MyClass
My Class
..我应该
Date
Some Date
Class
My Class
..但我得到了
Date
Some Date
所以看起来DisplayForModel找到DateTime模板但不是我的自定义模板,即使我遵循通过属性类型命名它的约定。
我错过了什么。我正在使用MVC 3并且相信此功能已在MVC 2中提供
答案 0 :(得分:5)
仔细阅读MVC源代码后,事实证明这是不可能的。
原因是@Html.DisplayForModel()
尝试通过以下方式找到用于渲染的模板:
MyViewModel.cshtml
,MyViewModel.vbhtml
,{{1}中查找模型类型的名称,即MyViewModel.ascx
或~\Views
或~\Views[ControllerName]
等}},~\Views\DisplayTemplates
,~\Views\Shared
~\Views\Shared\DisplayTemplates
结束,因为存在内置模板对象模板的设计使得它根据以下条件从元数据中检索所有模型的属性以进行渲染:
Object
因此,将始终排除任何复杂类型的属性。我认为混淆来自于Brad Wilson's post on custom object template,他在那里创建了一个自定义对象模板,并解决了浅水潜水与深水潜水的问题。通过实现自定义深潜对象模板,这将覆盖内置对象模板,并且可以渲染复杂类型。