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

我想在我的应用程序中有2个单独的布局。 假设一个用于网站的公共部分,另一个用于会员方。

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

  • PublicController
  • StaffController

而且他们每个都有一个对应的布局。

  • _PublicLayout.cshtml
  • _StaffLayout.cshtml

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

谢谢!

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

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

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

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

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

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

另一种可能性是自定义操作filter将覆盖布局。 正如你可以看到许多可能性来实现这一点。 由您决定哪一个最适合您的情况。


更新:

按照评论部分的要求,这里是一个select母版页的动作filter的例子:

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

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

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

更多的方法可以在这里find,希望这可以帮助别人。

此方法是初学者在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; } 

在这里阅读完整的文章“如何在ASP.NET MVC中呈现不同的布局”