2012-07-25 68 views
0

我正在MVC網站上有兩個單獨的視圖的移動和網頁。後臺工作是一樣的。所以我想要有兩個視圖相同的控制器。ASP.NET MVC 3/4-多視圖單控制器

以下是該文件夾的結構。

查看 - >用於查看的文件夾。

Customer -> This folder is for web 

       Index.cshtml -> Customer listing view for web 

    MobileCustomer-> This folder is for mobile 

       Index. cshtml -> Customer listing view for mobile. 

現在背景的東西都是相同的兩個用戶界面都爲手機和網絡是diffrerent。所以我想爲此使用相同的客戶控制器。所以在asp.net mvc項目的Controller文件夾中。我有客戶控制器,我想使用它。

但我希望每個手機的URL都不一樣。

本地主機/客戶/ - >這將加載普通視圖爲客戶

本地主機/移動/客戶 - >這將加載移動視圖爲客戶

我怎麼可以用asp.net的MVC 3實現這一目標或4申請?

+0

爲什麼你需要* mobile *和* web *的不同地址? – VJAI 2012-07-25 13:58:02

回答

1

ScottHa在博客中關於custom view engine的博客,您可以使用它將您的移動視圖與桌面客戶端視圖分開,並基於用戶代理服務於其中一個或另一個。 NuGet與ASP.NET MVC 4中的內置功能兼容,因此遷移對您來說更容易。因此,如果您使用的是ASP.NET MVC 3,請繼續下載MobileViewEngines NuGet並開始使用它。如果你使用的是ASp.NET MVC4,那麼這已經是你內置的了。

+0

嗨達林我想要不同的網址不是相同的URL和基於設備,它會檢測到的觀點。 – 2012-07-25 11:42:08

+0

然後,只需調整NuGet(它具有完整的源代碼可用),以便除了使用User-Agent請求標頭之外,還可以在決定渲染哪個視圖時使用url。它應該非常簡單。 – 2012-07-25 11:44:40

+0

好吧,會嘗試不確定它的工作與否。我在asp.net mvc 4上嘗試過,其中移動視圖也存在,但不起作用。 – 2012-07-25 12:48:05

0

在跟進Darin的迴應。 ASP.NET MVC4內置了一個基於MobileViewEngines的「視圖切換器」。

忽略了一個重要細節是這些視圖切換器在根據用戶代理進行決定之前首先檢查是否存在Cookie或其他變量(如子域(視圖首選項))。這樣,移動設備上的某個人可以切換到桌面視圖,反之亦然。

視圖切換器掛鉤到ViewEngine中,以便當您有一個帶有索引操作的客戶控制器並呈現Index.cshtml視圖時,您可能會設置規則,以便移動設備將呈現Index.mobile .cshtml視圖。您可以通過使用專用視圖ex的設置來創建自定義後綴。 Index.iphone.cshtml來呈現移動設備特定的視圖。因此,基本上,使用MVC4中存在的新機制,您的控制器及其操作將正常工作,而視圖引擎將呈現不同的視圖。如果你想在你的場景中做類似的事情,我建議你將MobileCustomer控制器分割成一個區域 - > Mobile(Area) - > CustomerController->等。

+0

我需要不同的手機和網絡的URL是可能的視圖切換器? – 2012-07-25 13:58:57

+0

另外我不想切換控制器,因爲其他明智的原因我們應該三個單獨的關注模型,控制器和視圖。 – 2012-07-25 13:59:41

0

我一直在瀏覽源代碼ASP.NET MVC 4,並發現一些有趣的事情,可能會幫助你。 這只是我的想法,我還沒有測試過!

我們必須從內置功能中自定義幾件事情。

  1. 查找來自不同文件夾的移動視圖。

  2. 只有當url包含移動時,才能呈現移動版本。

我們必須擴展DefaultDisplayMode類,以從我們的自定義文件夾中選擇移動視圖。 DefaultDisplayModeSystem.Web.WebPages程序集中。 TransformPath方法的基本實現將virtualPath/Views/Home/Index.cshtml轉換爲/Views/Home/Index.Mobile.cshtml

我們必須重寫TransformPath方法,該方法會將通過的virtualPath更改爲ex。從/Views/Home/Index.cshtml/Views/MobileHome/Index.cshtml

public class CustomDisplayMode: DefaultDisplayMode 
{ 
    // ... 

    protected override string TransformPath(string virtualPath, string suffix) 
    { 
     if (String.IsNullOrEmpty(suffix)) 
     { 
      return virtualPath; 
     } 

     // TO DO: modify the virtual path 
     // for ex. from /Views/Home/Index.cshtml to /Views/MobileHome/Index.cshtml 

     return virtualPath; 
    } 
} 

我們必須從Application _Start設置我們CustomDisplayModeDisplayModeProvider。我們可以設置ContextCondition,以便考慮URL。

DisplayModeProvider.Instance.Modes.Insert(0, new CustomDefaultDisplayMode("Mobile") 
{ 
    ContextCondition = (context => context.GetOverriddenBrowser().IsMobileDevice 
         && check context.Request.Url contains the Mobile segment) 
});