2012-03-21 39 views
6

我有控制器PlayerController和內部操作:ViewInfoList。 所以在網址「/播放器/視圖」我得到的結果與默認佈局。根據url更改控制器中的佈局

我想根據請求「/ External/View」獲得不同佈局的結果。

我該如何做到這一點?

回答

12

雖然可以覆蓋從控制器的佈局已在另一個答案被提出,在我看來,這意味着控制器越來越剛剛參與確定用戶界面將是什麼。最好把這個純粹留給Views來決定。

的最接近你的要求是要做到這一點在當前的"~/Views/_ViewStart.cshtml"

@{ 
    if(Context.Request.Path.StartsWith("/External", StringComparison.OrdinalIgnoreCase)) 
    Layout = "~/Views/_ExternalLayout.cshtml"; 
    else 
    Layout = "~/Views/_Layout.cshtml"; 
} 

哪裏"~/Views/_ExternalLayout.cshtml"是你選擇的佈局。

可能想檢查領先的"/"在那裏是正確的,我不記得它是否是。

如果你把這個放在現有的_ViewStart中,那麼任何正在渲染的視圖都會響應一個以"/External"開頭的url來使用這個新的佈局,否則就會使用'普通'的佈局。

另一種方法是使用路由表添加可用於此處的路由值以作出佈局決策;但我已經採用這種方法來保持簡單。

+0

我將使用相同的PlayerController「/外部/視圖」。所以我應該以某種方式指定路由? – 2012-03-21 09:07:14

+0

@NikitaMartyanov - 由於您重新使用相同的控制器,所以稍微改變了我的答案,原始解決方案適用於不同的控制器,但不適用於重複使用不同URL的視圖和控制器。 – 2012-03-21 09:22:42

+0

謝謝安德拉斯 - 我使用這種方法(我也添加了路由,所以「Exteranal/View」被映射到'PlayerController' – 2012-03-21 12:37:55

8

您可以指定在'ExternalController'控制器操作中返回視圖時應該使用哪個佈局。

return View("View", "~/Views/Shared/_AnotherLayout.cshtml") 
+0

謝謝,你安全我的日子:D – 2013-01-18 07:06:16