我该如何在ASP.NET MVC 3 Razor ViewStart文件中指定不同的布局?
我该如何在ASP.NET MVC 3 Razor ViewStart文件中指定不同的布局?
我希望在我的应用程序中拥有两个不同的布局。比如说一个用于网站的公共部分,另一个用于会员端。
为了简单起见,假设每个站点的所有逻辑都被整洁地包含在两个不同的控制器中。
- PublicController
- StaffController
并且它们都有对应的布局以适用它们下面所有的视图。
- _PublicLayout.cshtml
- _StaffLayout.cshtml
我该如何使用_ViewStart.cshtml文件来指定所有在“Public”下面的视图/操作都使用PublicLayout,而在“Staff”下面的所有内容都使用StaffLayout?
admin 更改状态以发布 2023年5月23日
您可以在/ Views / Public
文件夹中放置一个 _ViewStart.cshtml
文件,它将覆盖/ Views
文件夹中的默认文件,并指定所需的布局:
@{ Layout = "~/Views/Shared/_PublicLayout.cshtml"; }
类比的,您可以在/ Views / Staff
文件夹中放置另一个 _ViewStart.cshtml
文件,其中包含:
@{ Layout = "~/Views/Shared/_StaffLayout.cshtml"; }
您还可以指定在返回控制器操作中的视图时应使用哪个布局,但这是每个操作的指定:
return View("Index", "~/Views/Shared/_StaffLayout.cshtml", someViewModel);
还有一种可能性是自定义操作过滤器,它将覆盖布局。如您所见,有许多实现此目的的可能性。由您选择最适合您场景的方法。
更新:
在评论部分请求的是一个选择主页面的操作过滤器,下面是一个示例:
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(); }