MVC 3自定义模板和EditorForModel混淆

ric*_*rdo 8 asp.net-mvc templates asp.net-mvc-3

据我所知

给出一个视图模型

public class MyViewModel{
    public DateTime Date {get; set;}
    public MyClass Class {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

.. a View Views\MyController\MyAction.cshtml

@model MyViewModel
@Html.DisplayForModel()
Run Code Online (Sandbox Code Playgroud)

..部分View Views\Shared\DisplayTemplates\DateTime.chstml

@model DateTime
Some Date
Run Code Online (Sandbox Code Playgroud)

..另一部分View Views\Shared\DisplayTemplates\MyClass.cshtml

@model MyClass
My Class
Run Code Online (Sandbox Code Playgroud)

..我应该得到

Date
Some Date
Class
My Class    
Run Code Online (Sandbox Code Playgroud)

..但我得到了

Date
Some Date
Run Code Online (Sandbox Code Playgroud)

因此,似乎DisplayForModel找到DateTime模板但不是我的自定义模板,即使我遵循通过属性类型命名它的约定.

我错过了什么.我正在使用MVC 3并且相信此功能已在MVC 2中提供

ric*_*rdo 5

仔细研究了MVC源代码后,事实证明这是不可能的.

原因是@Html.DisplayForModel()尝试通过以下方式找到用于渲染的模板:

  • 首先寻找模型的类型,即名称MyViewModel.cshtmlMyViewModel.vbhtmlMyViewModel.ascx等,在位置~\Views,~\Views[ControllerName],~\Views\DisplayTemplates,~\Views\Shared,~\Views\Shared\DisplayTemplates
  • 如果没有找到它,它将沿着模型的基本类型向下走,依次尝试每个类型的名称
  • 如果没有找到,它最终将结束Object,其中存在内置模板

对象模板的设计使得它根据以下条件从元数据中检索所有模型的属性以进行渲染:

metadata.ShowForDisplay
&& metadata.ModelType != typeof(EntityState)
&& !metadata.IsComplexType 
&& !templateInfo.Visited(metadata)
Run Code Online (Sandbox Code Playgroud)

因此,将始终排除任何复杂类型的属性.我认为混淆源于Brad Wilson关于自定义对象模板的帖子,他在那里创建了一个自定义对象模板,并解决了浅水潜水与深潜的问题.通过实现自定义深潜对象模板,这将覆盖内置对象模板,并且可以呈现复杂类型.