gpt4 book ai didi

asp.net-mvc - MVC 3 自定义模板和 EditorForModel 混淆

转载 作者:行者123 更新时间:2023-12-03 17:17:44 24 4
gpt4 key购买 nike

所以据我了解

给定一个 View 模型

public class MyViewModel{
public DateTime Date {get; set;}
public MyClass Class {get; set;}
}

.. 一个 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 中可用

最佳答案

仔细阅读 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)

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

    关于asp.net-mvc - MVC 3 自定义模板和 EditorForModel 混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6215291/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com