如何在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中呈现不同的布局”