2011-03-01 35 views
291

我想在我的应用程序中有2个独立的布局。假设一个用于该网站的公共部分,另一个用于成员方。如何在ASP.NET MVC 3剃须刀ViewStart文件中指定不同的布局?

为简单起见,可以说每个站点的所有逻辑被整齐地包裹到2个不同的控制器中。

  • PublicController
  • StaffController

,他们各自对所有下的每个视图相应的布局。

  • _PublicLayout.cshtml
  • _StaffLayout.cshtml

如何使用_ViewStart.cshtml文件来指定 “公用” 下的所有视图的/ Action中使用 “工作人员” 的PublicLayout一切使用StaffLayout?

谢谢!

+4

以防万一:如果您想要删除给定的'Razor'视图的布局,只需设置'Layout = null;' – 2014-03-19 05:53:36

+3

就像你的例子的一个注释,你应该没有名为Public和Staff的控制器,控制器通常被实现为入口点对某些关键业务实体(如EventController,UserController等)采取类似于CRUD的行动。如果您的应用程序是reas公共/工作人员管理人员的责任可能会很大。考虑地区。 http://msdn.microsoft.com/en-us/library/ee671793%28VS.100%29.aspx你可能会意识到这一点,但其他人阅读这可能会得到错误的想法,所以只是为了记录。 – Alex 2014-06-26 17:08:58

回答

516

你可以把一个_ViewStart.cshtml文件/Views/Public文件夹内这将覆盖默认一个在/Views文件夹,并指定所需的布局:

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

依此类推,你可以把另一个_ViewStart.cshtml文件/Views/Staff文件夹内有:

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

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

return View("Index", "~/Views/Shared/_StaffLayout.cshtml", someViewModel); 

还有一种可能性是自定义动作过滤器会覆盖布局。正如你可以看到许多可能性来实现这一点。由您决定哪种方案最适合您的情况。


UPDATE:

如这里的评论部分请求的动作过滤器会选择一个母版页的例子:

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; 
     } 
    } 
} 

,然后装饰控制器或与此动作自定义属性指定所需的布局:

[LayoutInjecter("_PublicLayout")] 
public ActionResult Index() 
{ 
    return View(); 
} 
+0

@Justin,我也在我的回答中说过:-)来的例子... – 2011-03-01 23:01:32

+1

@DarinDimitrov我将在哪里创建'LayoutInjecterAttribute'。 ?有没有特定的位置? – kbvishnu 2012-07-18 10:26:16

+2

@VeeKeyBee,你可以把它放在一个'ActionFilters'子文件夹中。 – 2012-07-18 11:26:33

14

此方法是初学者在ASP.NET MVC应用程序中控制布局渲染的最简单方法。我们可以识别控制器并将布局渲染为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; 
     } 

阅读全文here“如何在ASP中呈现不同的布局。NET MVC”

27

还有一个方法是定义视图中的布局:

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

更多的方法可以做到,可以发现here,希望这可以帮助别人

+1

这将不起作用 - 如果没有单独的_ViewStart.cshtml,您的视图仍将在另一个布局的@RenderBody()方法内呈现。 – Tillman32 2016-12-05 02:16:47

+0

这个!为什么每个人都在提出这些极其复杂的过程,当你需要做的就是这个! – 2018-02-13 16:54:00