2011-04-05 26 views
2

MVC的美妙之處在於關注的分離,特別是來自Asp.net webforms世界。什麼是處理您的asp.net mvc 2應用程序的移動版本的最佳實踐方法

我現在有一個MVC站點,包含控制器,動作,模型和視圖。

看着我的網站,我可以看到要爲它提供移動版本,我所要做的就是換掉其視圖部分,並保持控制器,操作和模型不變。

但是,這種「交換」的最佳方法是什麼,特別是在Asp.net MVC 2中?

不可否認,控制器和視圖之間有一些耦合。例如,某些操作反映了視圖的名稱,因此按照約定進行佈線。有時在返回模型時顯式定義視圖。

有時甚至,控制器中的操作包含基於的條件,這是一個jax調用,以返回不同的視圖,例如部分視圖。

因此,考慮到這一點,我說我對我目前的網站很滿意,但現在我想創建一個iPad版本。所以它包含用於觸摸事件的特殊js庫,並且視圖可能不那麼冗長,當然CSS不同。

我該如何將其構建到我的MVC 2項目中?

乾杯

回答

1

一種方法,把我的頭頂部,將創建自己的視圖引擎並覆蓋FindView,它可以訪問控制器的上下文,因此HttpContext的。你可以使用它來根據用戶代理選擇不同的視圖,使用某種模式,比如附加_ipad或其他東西。

快速示例:

的Global.asax

protected void Application_Start() 
{ 
    RegisterRoutes(RouteTable.Routes); 
    ViewEngines.Engines.Clear(); 
    ViewEngines.Engines.Add(new CustomViewEngine()); 
    AreaRegistration.RegisterAllAreas(); 
} 

CustomViewEngine:

public class CustomViewEngine : WebFormViewEngine 
{ 
    protected override IView CreateView(ControllerContext controllerContext, string viewPath,string masterPath) 
    { 
     if (controllerContext.HttpContext.Request.UserAgent.Contains("ipad")) 
     { 
      return base.CreateView(controllerContext, viewPath.Replace(".aspx","_ipad.aspx").Replace(".ascx","_ipad.ascx"), masterPath); 
     } 
     else 
     { 
      return base.CreateView(controllerContext, viewPath, masterPath); 
     } 
    } 
} 
+0

+ 1嗯,好主意。你有沒有使用這個例子?我不希望它太過矯枉過正......? – andy 2011-04-05 05:13:02

+0

只是一個警告 - 你要確保移動用戶可以覆蓋這一點,如果他們願意使用完整的網站。 – Justin 2011-04-05 05:13:13

+0

@Kragen - 是的,當然。它可能會基於url值而不是useragent。 – andy 2011-04-05 05:14:25

相關問題