2011-03-01 36 views
291

我想在我的應用程序中有2個獨立的佈局。假設一個用於該網站的公共部分,另一個用於成員方。如何在ASP.NET MVC 3剃鬚刀ViewStart文件中指定不同的佈局?

爲簡單起見,可以說每個站點的所有邏輯被整齊地包裹到2個不同的控制器中。

  • PublicController
  • StaffController

,他們各自對所有下的每個視圖相應的佈局。

  • _PublicLayout.cshtml
  • _StaffLayout.cshtml

如何使用_ViewStart.cshtml文件來指定 「公用」 下的所有視圖的/ Action中使用 「工作人員」 的PublicLayout一切使用StaffLayout?

謝謝!

+4

以防萬一:如果您想要刪除給定的'Razor'視圖的佈局,只需設置'Layout = null;' – 2014-03-19 05:53:36

+3

就像你的例子的一個註釋,你應該沒有名爲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

回答

516

你可以把一個_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(); 
} 
+0

@Justin,我也在我的回答中說過:-)來的例子... – 2011-03-01 23:01:32

+1

@DarinDimitrov我將在哪裏創建'LayoutInjecterAttribute'。 ?有沒有特定的位置? – kbvishnu 2012-07-18 10:26:16

+2

@VeeKeyBee,你可以把它放在一個'ActionFilters'子文件夾中。 – 2012-07-18 11:26:33

14

此方法是初學者在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; 
     } 

閱讀全文here「如何在ASP中呈現不同的佈局。NET MVC」

27

還有一個方法是定義視圖中的佈局:

@{ 
    Layout = "~/Views/Shared/_MyAdminLayout.cshtml"; 
    } 

更多的方法可以做到,可以發現here,希望這可以幫助別人

+1

這將不起作用 - 如果沒有單獨的_ViewStart.cshtml,您的視圖仍將在另一個佈局的@RenderBody()方法內呈現。 – Tillman32 2016-12-05 02:16:47

+0

這個!爲什麼每個人都在提出這些極其複雜的過程,當你需要做的就是這個! – 2018-02-13 16:54:00