6

我正在对视图、控制器和模型进行分组。结构是

~/Controllers
-- /_Shared
--  -- /Views
--  -- /Content
--  -- /Scripts
-- /Home
-- -- /Models
-- -- /Content
-- -- /Scripts
-- -- /Views
-- -- HomeController.cs
-- /Account
-- -- /Models
-- -- /Views
...

视图和部分视图有效,但布局(主视图)不起作用。当我在 .cshtml 文件中指定布局时,例如:

@{ Layout = "SimpleSharedLayout"; }

我收到此错误:在以下路径中找不到布局页面“SimpleLayout”:

“~/Controllers/Account/Views/SimpleSharedLayout”。

Asp.NET 仅搜索当前控制器目录中的布局,而不查看共享文件夹*(位于 ~/Controllers/_Shared/Views)*

虽然这工作得很好。

@Html.Partial("SharedPartialView")

我必须指定具有完整路径的布局,例如

@{ Layout = "~/Controllers/_Shared/Views/SimpleSharedLayout.cshtml"; }

这不是一件难事,但我为无法让它工作而疯狂。

使用 IIS Express、VS 2012、.NET 4.5

你知道我错过了什么吗?

我的视图引擎:

public class AreaViewEngine : RazorViewEngine
{
    public AreaViewEngine()
    {
        AreaViewLocationFormats = new[] {
                         "~/Controllers/{1}/Views/{0}.cshtml",
                         "~/Controllers/_Shared/Views/{0}.cshtml"};

        ViewLocationFormats = AreaViewLocationFormats;

        AreaMasterLocationFormats = new[] { "~/Controllers/_Shared/Views/{0}.cshtml" };

        MasterLocationFormats = AreaMasterLocationFormats;

        AreaPartialViewLocationFormats = new[] { "~/Controllers/_Shared/Views/{0}.cshtml",
                         "~/Controllers/{1}/Views/{0}.cshtml"};

        PartialViewLocationFormats = AreaPartialViewLocationFormats;
    }
 }
4

2 回答 2

2

恕我直言,您正在与框架的约定作斗争。我的建议是通过创建区域来按照这些场景的预期方式使用该框架。

我知道这可能不是您想要的答案,但我觉得您所描述的是 T 的区域。

于 2013-04-04T22:06:07.483 回答
0

尝试重载 ViewEngine 并覆盖 AreaMasterLocationFormats 和 MasterLocationFormats。检查这个其他惊人的答案,它可能是你正在寻找的。

如何在 MVC 中设置默认路由(到某个区域)

忽略标题,它实际上不是关于路由,而是 viewEngine 在哪里以及如何搜索文件。

于 2013-06-13T21:44:30.170 回答