MVC 3自定义模板和EditorForModel混淆

时间:2011-06-02 13:37:51

标签: asp.net-mvc asp.net-mvc-3 templates

据我理解

给定视图模型

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中提供

1 个答案:

答案 0 :(得分:5)

仔细阅读MVC源代码后,事实证明这是不可能的。

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

  • 首先在位置MyViewModel.cshtmlMyViewModel.vbhtml,{{1}中查找模型类型的名称,即MyViewModel.ascx~\Views~\Views[ControllerName]等}},~\Views\DisplayTemplates~\Views\Shared
  • 如果找不到,它会沿着模型的基本类型向下走,依次尝试每个类型的名称
  • 如果找不到,它最终会以~\Views\Shared\DisplayTemplates结束,因为存在内置模板

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

Object

因此,将始终排除任何复杂类型的属性。我认为混淆来自于Brad Wilson's post on custom object template,他在那里创建了一个自定义对象模板,并解决了浅水潜水与深水潜水的问题。通过实现自定义深潜对象模板,这将覆盖内置对象模板,并且可以渲染复杂类型。