2015-12-21 67 views
0

我使用MVC 5和希望覆蓋下面查看方法在我的MVC控制器獲取佈局名稱

protected internal virtual ViewResult View(string viewName, string masterName, object model) 

我可以有許多不同的佈局意見,希望得到當前佈局在運行時輸入名稱並將其傳遞給覆蓋視圖方法。如何在控制器運行時獲取佈局名稱?

編輯 我不認爲我需要建立什麼我需要做一個自定義視圖引擎。我基本上只想在多個方法和控制器中設置一個ViewBag值,並且不想重複自己。我有在運行時的viewName和模型價值,只是沒有佈局的名字傳遞的masterName參數

protected override ViewResult View(string viewName, string masterName, object model) 
{ 
ViewBag.SomeValue = GetValue();    
return base.View(viewName, masterName, model); 
} 
+0

我認爲你正在談論創建自定義視圖引擎。看看一些例子: http://www.codeproject.com/Articles/294297/Creating-your-own-MVC-View-Engine-into-MVC-Applica http://weblogs.asp.net/ imranbaloch /視圖引擎與動態視圖位置 – MichaelLake

+0

@MichaelLake我不認爲我需要創建一個自定義視圖,我認爲這是對我想要的矯枉過正,我已經編輯上面顯示它是什麼我努力實現。 – TheGaff

+0

@Gene,如果它是不會輕易可以做到什麼,我與查看方法試圖然後我會看看FilterAttribute。我只是認爲爲視圖獲取佈局名稱會更直接,但我可能在這方面有錯誤。 – TheGaff

回答

0
你在使用,使在運行時決定

- 有一些標識符 會告訴你使用哪個主人?也許你可以做一個開關?

Switch (loggedInUser.SomeSpecialValue) 
{ 
Case: "value1": 
return "_Layout1.cshtml"; 
} 

否則怎麼你打算做出決定,以佈局以顯示哪些?

編輯:好的擴展上面的想法 - 也許這樣的事情可以幫助你:

RouteConfig

routes.MapRoute(
       name: "Default", 
       url: "{layout}/{controller}/{action}/{id}", 
       defaults: new { layout = "default", controller = "Home", action = "Index", id = UrlParameter.Optional } 
      ); 

的HomeController

protected override ViewResult View(string viewName, string masterName, object model) 
     { 
      var layout = RouteData.Values["layout"].ToString(); 

      switch (layout) 
      { 
       case "default": 
        return base.View(viewName, "_layout", model); 
       case "test": 
        return base.View(viewName, "_layout2", model); 
      } 

      return base.View(viewName, masterName, model); 
     } 

查看 的Cre根據需要預覽Layout視圖,並將它們添加到Shared文件夾和switch語句。

測試URL的

http://localhost:64372/ -> Default Layout 
http://localhost:64372/default/home/index 
http://localhost:64372/test/ -> 2nd Layout 
http://localhost:64372/test/home/index 

希望這也許對你的作品?

+0

當前沒有自定義屬性集。我不認爲我需要設置一個。我以爲會有的請求或ControllerContext或在控制器請求管道的其他屬性,將有當前佈局的名字,我只希望傳下來的被覆蓋的方法觀的一個部分財產。你如何試圖解決您的問題 – TheGaff

+0

進出口仍然不是100%肯定 - 你有很多佈局文件(偉大的),你希望能夠看到哪一個是在使用中(好),但你是如何選擇使用哪一個首先? 這是你試圖選擇一個嗎? 在這種情況下,您首先需要一種選擇佈局的方法,然後存儲該選項(也許是一個cookie),然後您將可以再次訪問該值。 – MichaelLake

+0

佈局正在通過_ViewStart文件進行設置。由於我想從BaseController中調用我的方法,因此可能在多個不同的文件夾中存在不同的_ViewStart文件。我想這樣做而不添加一個cookie來存儲當前選擇的佈局屬性。我將改變我的方法,只是使用ActionFilter,而不用擔心佈局頁面。感謝你付出的努力。 – TheGaff