你可以把一个_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();
}
以防万一:如果您想要删除给定的'Razor'视图的布局,只需设置'Layout = null;' – 2014-03-19 05:53:36
就像你的例子的一个注释,你应该没有名为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