Mise à jour: Cette solution a un bug subtil. Le framework MVC remet en FindView
/FindPartialView
deux fois: une fois avec useCache=true
, et si ce n'est pas de retourner un résultat, une fois avec useCache=false
. Car il n'y a qu'un seul cache pour tous les types de points de vue, les utilisateurs mobiles peuvent voir les vues du bureau si un navigateur de bureau, a été la première à arriver.
Pour ceux qui s'intéressent à l'aide des moteurs de visualisation pour résoudre ce problème, Scott, Hanselman a mis à jour sa solution ici:
http://www.hanselman.com/blog/ABetterASPNETMVCMobileDeviceCapabilitiesViewEngine.aspx
(Mes excuses pour la réponse détourner, je ne veux pas que quiconque d'avoir à passer par ce!)
Édité par roufamatic (2010-11-17)
La première chose que vous voulez faire est de présenter l' Appareil Mobile du Navigateur de Fichiers à votre projet. À l'aide de ce fichier, vous pouvez cibler ce que jamais l'appareil que vous souhaitez prendre en charge, sans avoir à connaître les détails de ce que ces dispositifs envoyer dans leurs en-têtes. Ce fichier a déjà fait le travail pour vous. Vous utilisez ensuite la Demande.Navigateur propriété d'adapter la vue qui vous voulez retourner.
Ensuite, venir avec une stratégie sur la façon dont vous voulez organiser vos vues dans le dossier Vues. Je préfère laisser la version de bureau à la racine et ensuite avoir un Mobile dossier. Par exemple, la vue d'Accueil dossier devrait ressembler à ceci:
Je suis en désaccord avec @Mehrdad sur l'utilisation d'un affichage personnalisé du moteur. Le moteur d'affichage sert plus d'un but et un seul de ces objectifs est de trouver des points de vue pour le contrôleur. Vous faites cela en remplaçant la FindView méthode. Dans cette méthode, vous pouvez faire vos vérifications sur les lieux où trouver de la vue. Une fois que vous savez quel appareil à l'aide de votre site, vous pouvez utiliser la stratégie de toi pour l'organisation de votre point de vue pour revenir à la vue de cet appareil.
public class CustomViewEngine : WebFormViewEngine
{
public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
{
// Logic for finding views in your project using your strategy for organizing your views under the Views folder.
ViewEngineResult result = null;
var request = controllerContext.HttpContext.Request;
// iPhone Detection
if (request.UserAgent.IndexOf("iPhone",
StringComparison.OrdinalIgnoreCase) > 0)
{
result = base.FindView(controllerContext, "Mobile/iPhone/" + viewName, masterName, useCache);
}
// Blackberry Detection
if (request.UserAgent.IndexOf("BlackBerry",
StringComparison.OrdinalIgnoreCase) > 0)
{
result = base.FindView(controllerContext, "Mobile/BlackBerry/" + viewName, masterName, useCache);
}
// Default Mobile
if (request.Browser.IsMobileDevice)
{
result = base.FindView(controllerContext, "Mobile/" + viewName, masterName, useCache);
}
// Desktop
if (result == null || result.View == null)
{
result = base.FindView(controllerContext, viewName, masterName, useCache);
}
return result;
}
}
Le code ci-dessus vous permet de régler l'affichage en fonction de votre stratégie. L'automne est de retour à la vue du bureau, si aucune vue n'a été trouvé pour le périphérique ou si il n'y a pas un défaut de la vue mobile.
Si vous décidez de mettre de la logique dans votre contrôleur, au lieu de créer un moteur d'affichage. La meilleure approche serait de créer un personnalisé ActionFilterAttribute que vous pouvez décorer votre contrôleur avec. Puis remplacer le OnActionExecuted méthode pour déterminer l'appareil qui est de l'affichage de votre site. Vous pouvez le vérifier sur ce blog sur la façon d'. Le post a aussi quelques jolies quelques liens de Mélanger des vidéos sur ce sujet.