是否可以在 C# razor 应用程序中拥有多个布局页面?

Is it possible to have multiple layout pages in a C# razor application?

之前我使用 MVC 创建了 C# 应用程序,并且可以在其文件中指定要在视图上使用的布局视图。这样视图文件包含:

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

/*Rest of file*/

最近我开始使用 razor pages 创建应用程序。到目前为止,我只有一个布局页面。但是,我想为页面的子集使用不同的布局页面,我只能看到如何为页面文件夹中的所有页面指定一个布局页面。由于布局在 _ViewStart.cshtml 文件中声明。该文件的内容很简单:

@{
    Layout = "_Layout";
}

有没有办法对某些页面使用一个布局文件,然后对其他页面使用不同的布局文件?

如果你想 using one layout file for some pages, and then a different layout files for other pages。你可以尝试在 _ViewStart.cshtml 中获取当前 url,然后检查 url 并设置布局 page.Here是演示:

_ViewStart.cshtml(第1页和第2页设置Layout = "_Layout";,另一页设置Layout = "_Layout1";):

@{
    var routeUrl = ViewContext.RouteData.Values["Page"].ToString();
    //you can put pages' name into pages
    var pages = new List<string> { "Page1", "Page2"};
    //if routeUrl contains any of pages,the page will use _Layout as Layout page,the other pages will use _Layout1 ad Layout page
    if (pages.Any(routeUrl.Contains))
    {
        Layout = "_Layout";
    }
    else {
        Layout = "_Layout1";
    }

}

结果:

此外,您可以使用

@{
   Layout="xxx"
}

David Tansey所述,在不同的页面设置不同的布局。

有多种方法可以做到这一点:

  1. 即使您在 ViewStart.cshtml 中注册了单一布局,您仍然可以在特定页面上使用不同的布局,例如:

    Layout = "~/Views/Shared/_Layout2.cshtml";

  2. 您可以使用 ViewData 或 ViewBag 分配布局值并在您的 cshtm 文件中使用它

  3. 您可以添加一个检查来识别您需要使用的布局:

.....

@{
    if (User.IsInRole("Admin"))
    {
        Layout = "_AdminLayout";
    }
    else
    {
        Layout = "_Layout";
    }
}