Aktualisieren: Diese Lösung hat einen kleinen Fehler. Das MVC-Framework wird zweimal in FindView
/FindPartialView
aufrufen: einmal mit useCache=true
, und wenn das kein Ergebnis zurückgibt, einmal mit useCache=false
. Da für alle Arten von Sichten nur ein Cache verfügbar ist, sehen mobile Benutzer möglicherweise Desktop-Ansichten, wenn ein Desktop-Browser als erster eintrifft.
diejenigen Interessierten in benutzerdefinierte Ansicht Engines, dieses Problem zu lösen, hat Scott Hanselman seine Lösung hier aktualisiert:
http://www.hanselman.com/blog/ABetterASPNETMVCMobileDeviceCapabilitiesViewEngine.aspx
(Apologies für die Antwort Hijack, ich jemand will nicht nur anderes haben durch diese gehen!)
Herausgegeben von roufamatic (2010-11-17)
Das erste, was Sie tun möchten, ist die Einführung des Mobile Device Browser File zu Ihrem Projekt. Mit dieser Datei können Sie gezielt auf jedes Gerät zugreifen, das Sie unterstützen möchten, ohne die Einzelheiten dessen kennen zu müssen, was diese Geräte in ihren Headern senden. Diese Datei hat die Arbeit für Sie bereits erledigt. Anschließend verwenden Sie die Request.Browser-Eigenschaft, um die Ansicht anzupassen, die Sie zurückgeben möchten.
Als nächstes finden Sie eine Strategie, wie Sie Ihre Ansichten unter dem Ordner Ansichten organisieren möchten.Ich ziehe es vor, die Desktop-Version im root zu lassen und dann einen Mobile-Ordner zu haben. Zum Beispiel würde die Home-Ansicht Ordner wie folgt aussehen:
Ich habe mit @Mehrdad anderer Meinung zu sein über eine benutzerdefinierte Ansicht-Engine. Die View-Engine dient mehr als einem Zweck, und einer dieser Zwecke besteht darin, Ansichten für den Controller zu finden. Sie tun dies, indem Sie die FindView-Methode überschreiben. In dieser Methode können Sie überprüfen, wo die Ansicht zu finden ist. Nachdem Sie wissen, welches Gerät Ihre Site verwendet, können Sie die Strategie, die Sie zum Organisieren Ihrer Ansichten entwickelt haben, verwenden, um die Ansicht für dieses Gerät zurückzugeben.
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;
}
}
Mit dem obigen Code können Sie die Ansicht basierend auf Ihrer Strategie festlegen. Der Rückfall ist die Desktop-Ansicht, wenn keine Ansicht für das Gerät gefunden wurde oder wenn keine Standard-Ansicht für Mobilgeräte vorhanden ist.
Wenn Sie sich dafür entscheiden, die Logik in Ihren Controller zu legen, anstatt eine View-Engine zu erstellen. Der beste Ansatz wäre, eine benutzerdefinierte ActionFilterAttribute zu erstellen, mit der Sie Ihren Controller dekorieren können. Überschreiben Sie dann die OnActionExecuted-Methode, um festzustellen, welches Gerät Ihre Site anzeigt. Sie können dies überprüfen blog post auf, wie man. Der Beitrag enthält auch einige nette Links zu einigen Mix-Videos zu diesem Thema.
helfen Wird nicht mit T4MVC arbeiten, übernehmen Sie die Viewname ist nur ein Name und kein Pfad. funktioniert auch nicht im Freigabemodus wegen der Zwischenspeicherung. –
Habe es nicht versucht seit T4MVC veröffentlicht wurde. Das war vorher, das war verfügbar. Wenn ich Zeit habe, werde ich die Antwort aktualisieren, um meine Ergebnisse beim Testen gegen T4MVC widerzuspiegeln. –
Carl, was meinst du mit Caching? Dieser Ansatz ist identisch mit dem, was Scott Hanselman hier beschreibt: http://www.hanselman.com/blog/MixMobileWebSitesWithASPNETMVCAndTheMobileBrowserDefinitionFile.aspx und er erwähnt es nicht. – roufamatic