2012-04-27 2 views
0

Je suis en train d'ajouter une extension mobile aux noms des vues lorsqu'elle est détectée.Comment implémenter "cascade" ViewEngineResults?

Voici le code actuel:

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); 
} 

Donc, si la route va SomeController et les paramètres de l'application dit que le groupe est « teamA » (par exemple) le point de vue qui sera rendu Index_TeamA.cshtml.

Cependant, s'il n'y a pas Index_TeamA.cshtml alors il est par défaut Index.cshtml comme on pourrait s'y attendre.

(Ceci est parce qu'il ya de très légères variations dans certaines des vues demandées par certaines équipes.)

Mais maintenant, je veux ajouter un autre niveau à ce pour les versions mobiles:

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); 
} 

Cependant , le problème est que si Index_TeamA_MOB.cshtml est introuvable, il est par défaut à Index.cshtml, lorsque je veux en fait par défaut à Index_TeamA.cshtml.

Il est assez clair pourquoi cela se produit, la question est de savoir comment puis-je cascade cette implémentation? Donc, il vérifie d'abord la version mobile de la version du groupe (si le navigateur mobile est détecté), alors si ce n'est pas la solution de repli, alors si ce n'est pas le cas, l'affichage par défaut?

UPDATE, voici la version 1

EDIT: Ok cela provoque une boucle infinie apparemment.

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); 
     } 

Répondre