Asp.net-Mvc
如何在 ASP.NET MVC 3 razor ViewStart 文件中指定不同的佈局?
我想在我的應用程序中有 2 個單獨的佈局。假設一個用於網站的公共部分,另一個用於會員端。
為簡單起見,假設每個站點的所有邏輯都整齊地包裝在 2 個不同的控制器中。
- 公共控制器
- 員工控制器
並且它們每個都有一個對應的佈局,用於每個視圖下的所有視圖。
- _PublicLayout.cshtml
- _StaffLayout.cshtml
如何使用 _ViewStart.cshtml 文件來指定“Public”下的所有視圖/操作都使用 PublicLayout,而“Staff”下的所有內容都使用 StaffLayout?
您可以在文件夾中放置一個
_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);另一種可能性是自定義操作過濾器,它將覆蓋佈局。如您所見,實現這一目標的可能性很多。由您決定哪一個最適合您的場景。
更新:
根據評論部分的要求,這是一個選擇母版頁的操作過濾器範例:
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(); }