如何在ASP.NET MVC 3 razor ViewStart文件中指定不同的布局?

Jus*_*tin 308 asp.net-mvc layout razor asp.net-mvc-3

我希望在我的应用程序中有2个单独的布局.假设一个是网站的公共部分,另一个是会员方面.

为简单起见,我们可以说每个站点的所有逻辑都整齐地包含在2个不同的控制器中.

  • PublicController
  • StaffController

并且它们每个都具有相应的布局,用于每个视图下的所有视图.

  • _PublicLayout.cshtml
  • _StaffLayout.cshtml

如何使用_ViewStart.cshtml文件指定"Public"下的所有View/Action使用PublicLayout,"Staff"下的所有内容都使用StaffLayout?

谢谢!

Dar*_*rov 550

您可以将_ViewStart.cshtml文件放在/Views/Public文件夹中,该文件将覆盖文件夹中的默认/Views文件并指定所需的布局:

@{
    Layout = "~/Views/Shared/_PublicLayout.cshtml";
}
Run Code Online (Sandbox Code Playgroud)

通过类比,您可以将另一个_ViewStart.cshtml文件放在/Views/Staff文件夹中:

@{
    Layout = "~/Views/Shared/_StaffLayout.cshtml";
}
Run Code Online (Sandbox Code Playgroud)

您还可以指定在控制器操作中返回视图时应使用的布局,但这是每个操作:

return View("Index", "~/Views/Shared/_StaffLayout.cshtml", someViewModel);
Run Code Online (Sandbox Code Playgroud)

另一种可能性是自定义动作过滤器,它将覆盖布局.你可以看到实现这一目标的许多可能性.由您决定哪种方案最适合您的方案.


更新:

根据评论部分的要求,这里是一个动作过滤器的例子,它将选择一个母版页:

public class LayoutInjecterAttribute : ActionFilterAttribute
{
    private readonly string _masterName;
    public LayoutInjecterAttribute(string masterName)
    {
        _masterName = masterName;
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        base.OnActionExecuted(filterContext);
        var result = filterContext.Result as ViewResult;
        if (result != null)
        {
            result.MasterName = _masterName;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后使用此自定义属性修饰控制器或操作,指定所需的布局:

[LayoutInjecter("_PublicLayout")]
public ActionResult Index()
{
    return View();
}
Run Code Online (Sandbox Code Playgroud)

  • @VeeKeyBee,你可以将它放在一个`ActionFilters`子文件夹中. (2认同)

sto*_*tom 29

另一种方法是在视图中定义布局:

   @{
    Layout = "~/Views/Shared/_MyAdminLayout.cshtml";
    }
Run Code Online (Sandbox Code Playgroud)

更多方法可以在这里找到,希望这有助于某人.


小智 14

此方法是初学者在ASP.NET MVC应用程序中控制Layouts渲染的最简单方法.我们可以识别控制器并将Layouts渲染为par控制器,为此,我们可以在Views文件夹的根目录中的_ViewStart文件中编写代码.以下是一个示例,说明如何完成.

  @{
             var controller = HttpContext.Current.Request.RequestContext.RouteData.Values["Controller"].ToString();
             string cLayout = "";
            if (controller == "Webmaster") {
                  cLayout = "~/Views/Shared/_WebmasterLayout.cshtml";
                 }
               else {
                cLayout = "~/Views/Shared/_Layout.cshtml";
               }
        Layout = cLayout;
         }
Run Code Online (Sandbox Code Playgroud)

阅读全文在这里 "如何在ASP.NET MVC呈现不同的布局"