2012-03-30 77 views
3

我一直在玩ASP.net MVC 4的新顯示模式功能,您可以將手機添加到顯示頁面(Index.Mobile.cshtml),它會呈現移動設備的移動版本。是否有可能爲不同的用戶代理使用不同的控制器?像HomeController.Mobile.cs的東西?我試過這個,但它不起作用。編譯器希望HomeController.cs和HomeController.Mobile.cs是局部的。asp.net mvc 4顯示模式和控制器

我知道我可以創建一個移動區域並將所有移動流量重定向到該區域,以便移動設備擁有自己的控制器。但是,我更喜歡HomeController.Mobile.cs之類的東西,因此它使得代碼庫更乾淨。否則,使用ASP.net 4的顯示模式,移動版本和頁面的網頁版本將具有相同的控制器邏輯,這並不總是需要的。有關如何做到這一點的任何想法?

回答

6

文件名對類沒有任何意義,所以我不確定你對「HomeController.Mobile.cs」的想法有什麼想法。正如您所指出的,您不能擁有兩個同名的HomeController類,因此它可以是單獨的控制器/區域/應用程序,也可以是共享的。

如果你使用默認的公約,並具有相同的控制器,可以根據設備類型叉掉你的邏輯:

if (HttpContext.GetOverriddenBrowser().IsMobileDevice) 
{ 
    //mobile specific logic 
} 

如果您發現許多控制器/行動有不同的邏輯取決於設備鍵入然後我會爭辯說,你有單獨的應用程序確實是有意義的使用區域,甚至是一個單獨的Web應用程序,如果需要,恕我直言。我會盡力根據這個決定我走的路徑。

編輯以解決評論:

我明白你想要什麼;當我嘗試製作我的博客的jQuery Mobile版本時,我不得不做類似的事情。基本上,我看到它有3個選項:

  1. 控制器具有一組檢索所有視圖的所有數據的邏輯。每個視圖簡單地使用它所需要的。
  2. 帶有「if(isMobile)」的控制器執行某些邏輯並在移動設備的情況下返回移動視圖,並執行不同的邏輯並在其他視圖中返回默認視圖。
  3. 一個完全獨立的區域或應用程序顯式移動(例如mobile.yourapp.com)

聽起來像是你不想#2或#3千萬,所以你認爲#1?移動設備的瓶頸在於其資源和網絡,因此如果您的服務器必須執行「額外」工作才能獲取移動視圖永遠不會呈現的某些數據集,我不會過於擔心。

+0

移動設備與網頁不同。最顯着的是屏幕的實際尺寸。我在想,對於任何特定的請求,如果一個網頁,然後我可以提供更多的內容來填補屏幕房地產然後我可以做一個移動設備。 MVC 4爲基於用戶代理切換視圖提供了一些很棒的功能。我可以根據不同的接口獲得不同的視圖,但是,我堅持使用相同的控制器來爲不同的視圖收集不同的數據集。我不想要「如果(isMobileDevice)」在控制器中。任何其他選項? – 2012-03-30 21:14:28

+0

對不起,在第一條評論中用完了字符......總之,對於給定的請求,我想根據用戶代理提供不同的數據(即不同的接口)。我如何在控制器中有效地做到這一點? – 2012-03-30 21:17:02

+0

@TomSchreck,我做了一些編輯以解決您的意見 – 2012-03-31 01:05:30