2012-04-27 60 views
0

我正在爲檢測到的視圖名稱添加移動擴展程序。如何實現「級聯」ViewEngineResults?

下面是當前的代碼:

public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache) 
{ 
     string GroupName = System.Configuration.ConfigurationManager.AppSettings["GROUP"]; 

     return base.FindView(controllerContext, viewName + "_" + GroupName, masterName, useCache); 
} 

因此,如果路線去SomeController和應用程序設置說,該組織是「TeamA」(例如),將渲染視圖將是Index_TeamA.cshtml

但是,如果沒有Index_TeamA.cshtml那麼它默認爲Index.cshtml,正如人們所期望的那樣。

(這是因爲有一些由一些球隊所要求的看法有微小變化。)

但是現在我要到另一個層次添加到這個移動版本:

public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache) 
{ 
     string GroupName = System.Configuration.ConfigurationManager.AppSettings["GROUP"]; 

     if (HttpContext.Current.Request.Browser.IsMobileDevice) 
      GroupName += "_MOB"; 

     return base.FindView(controllerContext, viewName + "_" + GroupName, masterName, useCache); 
} 

然而,問題是,如果找不到Index_TeamA_MOB.cshtml,則默認爲Index.cshtml,實際上我希望它默認爲Index_TeamA.cshtml

這很清楚爲什麼發生這種情況,問題是我該如何級聯這個實現?因此,它首先檢查組版本的移動版本(如果檢測到移動瀏覽器),那麼如果沒有回退到組版本,那麼如果沒有,那麼獲取默認視圖?

UPDATE,這裏是版本1

編輯:好吧這會導致一個無限循環明顯。

public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache) 
     { 
      string GroupName = System.Configuration.ConfigurationManager.AppSettings["GROUP"]; 

      if (HttpContext.Current.Request.Browser.IsMobileDevice) 
      { 
       var result = ViewEngines.Engines.FindView(controllerContext, viewName + "_" + GroupName + "_MOB", masterName); 

       if (result != null) 
        return base.FindView(controllerContext, viewName + "_" + GroupName + "_MOB", masterName, useCache); 
      } 

      return base.FindView(controllerContext, viewName + "_" + GroupName, masterName, useCache); 
     } 

回答