【问题标题】:Is it possible to use different layouts in MVC4 based off of routes?是否可以根据路线在 MVC4 中使用不同的布局?
【发布时间】:2026-01-07 00:15:01
【问题描述】:

我的网站有一个单独的部分(路线),我想使用不同的布局/css 等。

因此,当用户访问我网站的主要部分时,他们会获得默认布局。 但是当他们登录并去商店时,商店部分(路线)使用不同的布局/css。

所以...

  • www.blahblahblah.com/
  • www.blahblahblah.com/admin/
  • www.blahblahblah.com/home/contactus/

...都使用默认的_Layout

但是……

  • www.blahblahblah.com/store/
  • www.blahblahblah.com/store/admin/

...使用 _LayoutStore

我已经看到根据此处 (http://forums.asp.net/t/1653362.aspx/1) 和此处 (How to use multiple Layout in MVC 3?) 的角色完成此操作,但我不想这样做。我需要根据客户采取的路线(也就是他们在里面的视图)来选择布局。

提前感谢您的任何帮助。

【问题讨论】:

  • 查看区域功能。您将拥有每个区域的共享文件夹,并且您将能够对其应用不同的布局。
  • 其实,这就是我所做的。我为我的商店创建了另一个区域,因为它几乎是我网站的另一个部分。感谢蒂亚戈的提示。

标签: asp.net-mvc asp.net-mvc-4 asp.net-mvc-routing asp.net-mvc-areas


【解决方案1】:

您是否查看过在任何给定视图文件夹中使用 _ViewStart.cshtml 文件?

如果这不是您要查找的内容,并且您希望路由中的值确定要使用的布局,您可以尝试创建一些帮助方法来返回要使用的布局:

    public static class LayoutHelper
    {
        public static string GetLayout(RouteData data, string defaultLayout = "")
        {
            if (data.Values["action"] == "edit")
                return "~/views/shared/_AdminLayout.cshtml";

            return defaultLayout;
        }
    }

然后你可以像这样从你的视图中调用它:

@{
    Layout = LayoutHelper.GetLayout(
        Request.RequestContext.RouteData,
        "~/views/shared/_layout.cshtml");
}

但在我看来,如果您在包含商店布局的 Views/Store 文件夹中创建了一个 _ViewStart.cshtml 文件,那么您会很高兴。

【讨论】:

  • 嗯,嘘,这是一个简单的解决方案!谢啦!在我的网站结构中,我现在有: -Views/ ---Store/ -----Shared/ --------_Layout.html -----_Viewstart.html -----Index.html 因为默认情况下,它似乎想在 /Store/ 和 /Store/Shared/ 目录中搜索 Index.html 文件。如何更改查找 index.html 的位置?或者例如其他观点?我需要设置新路线吗?
  • 为什么有Store/Shared 文件夹?看来你应该选择Store/_Store.Layout.cshtml。我认为 MVC 不会搜索距根 Views 文件夹深 2 层的子文件夹。
  • 通过我的实验/测试,它实际上总是在根目录和“共享”目录中搜索文件(例如“索引”和“_layout”)我想要完成的是同一个组织它包含在视图中,但位于名为 store 的子目录中。这样我就可以轻松跟踪商店的不同部分。
  • 如果布局不在当前视图所在的文件夹或共享文件夹中,您必须完全限定路径,例如 ~/store/shared/_layout.cshtml
  • 我最终做的是在我的项目中为商店创建一个“区域”。它非常适合我的需要。
最近更新 更多