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中提供
仔细研究了MVC源代码后,事实证明这是不可能的.
原因是@Html.DisplayForModel()
尝试通过以下方式找到用于渲染的模板:
MyViewModel.cshtml
或MyViewModel.vbhtml
或MyViewModel.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关于自定义对象模板的帖子,他在那里创建了一个自定义对象模板,并解决了浅水潜水与深潜的问题.通过实现自定义深潜对象模板,这将覆盖内置对象模板,并且可以呈现复杂类型.
归档时间: |
|
查看次数: |
4489 次 |
最近记录: |