2009-10-23 7 views
2

Je tente d'implémenter un moteur de vue personnalisé pour diffuser des vues mobiles en fonction de l'agent utilisateur. Je suis l'approche de Scott Hanselman de this blog post.Le moteur d'affichage personnalisé ASP.NET MVC n'est pas appelé

J'ai hérité de WebFormsViewEngine et remplacé la méthode FindView de la même manière que Scott décrit dans son blog.

J'ai ensuite ajouté quelques lignes à ma méthode Global.asax Application_Start pour effacer la collection du moteur de vue et ajouter une nouvelle instance de mon moteur de vue.

Après quelques tests, il semblerait que MVC ignore mon moteur de vue. Lorsqu'il n'a pas réussi à trouver mes vues personnalisées en fonction de l'agent utilisateur du navigateur, j'ai recouru au codage en dur du chemin personnalisé pour ajouter à la vue et il a quand même réussi à revenir sur la vue par défaut. J'ai mis un point d'arrêt dans ma méthode FindView et bien sûr, il n'est pas appelé du tout.

Comment puis-je faire fonctionner mon moteur de vue personnalisé? Toute aide sera très appréciée.

Mon moteur de vue ressemble à ceci:

public class MyViewEngine: WebFormsViewEngine 
{ 
    public override ViewEngineResult FindView (ControllerContext controllerContext, string viewName, string masterName, bool useCache) 
    { 
     ViewEngineResult result = null; 

     //Serve a special view for iPhones 
     if (UserAgentIs(controllerContext, "iPhone")) 
     { 
       result = base.FindView(controllerContext, "Mobile/iPhone/" + viewName, masterName, useCache); 
     } 

     //If no special view is found, fall back to the default view 
     if (result == null || result.View == null) 
     { 
       result = base.FindView(controllerContext, viewName, masterName, useCache); 
     } 

     return result; 
    } 

    private bool UserAgentIs(ControllerContext controllerContext, string userAgentToTest) 
    { 
     return (controllerContext.HttpContext.Request.UserAgent.IndexOf(userAgentToTest, StringComparison.OrdinalIgnoreCase) > 0); 
    } 
} 

Et dans mon Global.asax:

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

Lorsque cette configuration ne fonctionnait pas, j'ai essayé même de simplifier ma méthode de FindView à ceci:

public override ViewEngineResult FindView (ControllerContext controllerContext, string viewName, string masterName, bool useCache) 
    { 
     ViewEngineResult result = null; 
     result = base.FindView(controllerContext, "Mobile/iPhone/" + viewName, masterName, useCache); 
     return result; 
    } 

Et cela n'a pas fonctionné non plus. Il a toujours renvoyé la vue par défaut. Et oui, la page de vue et la page maître qui devraient être trouvées par cette déclaration existent réellement. Je suis assez perplexe quant à la raison pour laquelle cela ne fonctionne pas.

+0

Votre serveur Web détecte-t-il correctement que le client est un téléphone mobile? –

+0

Pouvons-nous voir votre implémentation du moteur de vue personnalisé? –

+0

Oui, ajouté du code à ma vue pour imprimer l'agent utilisateur et il montre la chaîne appropriée. Cependant, je crois que le problème est lié à MVC en ignorant mon moteur de vue tous ensemble. J'ai même enlevé la logique pour détecter le téléphone mobile et codé en dur le chemin d'accès mobile et toujours fini avec la vue par défaut. –

Répondre

2

Eh bien, c'est certainement embarrasing:

Quand j'ai écrit mon moteur de vue que je suivais le blog de Scott Hanselman (voir mon post original pour le lien). J'ai décidé de classer le code de Scott dans ma classe et de le modifier au besoin. J'ai accidentellement copié son code avec la définition de classe dans ma classe en créant une classe imbriquée. Par conséquent, mon moteur de vue ne contenait pas de substitution pour la méthode FindView et naturellement, celui de la classe imbriquée ne serait jamais appelé! Leçon: lorsque vous utilisez le code trouvé en ligne, ne copiez pas et ne collez pas! Toujours le taper vous-même.

Merci à tous ceux qui ont répondu à cette question et ont essayé de m'aider.

Je vais me mettre dans le coin de la honte et de l'embarras maintenant!

+0

:) Je suis content que vous ayez résolu le problème. –

+0

Voici le ViewEngine mis à jour/fixe pour vous: http://www.hanselman.com/blog/NuGetPackageOfTheWeek10NewMobileViewEnginesForASPNETMVC3SpeccompatibleWithASPNETMVC4.aspx –

Questions connexes