【问题标题】:Why isn't MVC4 looking in the Area-specific Views/Shared/DisplayTemplates folder?为什么 MVC4 不查看特定于区域的 Views/Shared/DisplayTemplates 文件夹?
【发布时间】:2025-12-22 06:15:16
【问题描述】:

尝试将一些代码从 MVC3 项目移动到 MVC4 项目,并遇到此问题。一个区域内有一些DisplayTemplates,像这样:

MVC Project
--Areas
----Identity
------Controllers
--------MyHomeController.cs
------Models
--------MyHomeViewModel.cs
--------MyEmailAddress.cs
------Views
--------Shared
----------DisplayTemplates
------------MyEmailAddress.cshtml
----------MyHome.cshtml
--------ViewStart.cshtml
--------Web.config
------IdentityAreaRegistration.cs

MyHomeController 有一个操作返回 MyHome.cshtml 视图,强类型化到 MyHomeViewModel。 MyHomeViewModel 包含一个 IEnumerable<MyEmailAddress> 属性。在“MyHome.cshtml”文件中,我有以下内容:

@foreach (var email in Model.Emails)
{
    @Html.DisplayFor(m => email)
}

但是,这不会呈现 MyEmailAddress.cshtml 模板。以下两个结果相同:

@foreach (var email in Model.Emails)
{
    @Html.DisplayFor(m => email, "MyEmailAddress")
}

@foreach (var email in Model.Emails)
{
    @Html.DisplayFor(m => email, "~/Areas/Identity/[rest of path]/MyEmailAddress.cshtml")
}

但是,如果我将 MyEmailAddress.cshtml 文件移动到根 Web 项目的 Views/Shared/DisplayTemplates 文件夹中,它确实使用此模板进行渲染。

由于某种原因,DisplayFor HtmlHelper 要么不在特定区域的 Views/Shared/DisplayTemplates 文件夹中查找,要么在该文件夹中查找其他内容。

我做错了什么?这在 MVC3 中有效,但我似乎无法在 MVC4 项目中正确使用它。

【问题讨论】:

    标签: asp.net-mvc-4 asp.net-mvc-areas mvc-editor-templates display-templates attributerouting


    【解决方案1】:

    在放弃并发布此问题后,我再次立即找到了自己的答案。

    MyHomeController 使用的是AttributeRouting。我发现如果我访问 URL /Identity/MyHome/Action,则 DisplayTemplate 被成功选择。但是对于我的自定义路线/my/home,它不是。将以下属性添加到 MyHomeController 修复了这个问题:

    [RouteArea("Identity")]
    public class MyHomeController : Controller
    

    【讨论】:

      最近更新 更多