你可以把一個_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