Aggiornamento: questa soluzione ha un bug sottile. Il framework MVC chiamerà in FindView
/FindPartialView
due volte: una volta con useCache=true
e se ciò non restituisce un risultato, una volta con useCache=false
. Dal momento che esiste una sola cache per tutti i tipi di visualizzazioni, gli utenti mobili potrebbero vedere le visualizzazioni desktop se prima arrivava un browser desktop.
Per chi fosse interessato ad utilizzare i motori di visualizzazione personalizzata per risolvere questo problema, Scott Hanselman ha aggiornato la sua soluzione qui:
http://www.hanselman.com/blog/ABetterASPNETMVCMobileDeviceCapabilitiesViewEngine.aspx
(Ci scusiamo per la risposta dirottamento, io non voglio nessun altro a devono passare attraverso questo!)
a cura di roufamatic (2010-11-17)
La prima cosa che si vuole fare è introdurre lo Mobile Device Browser File nel proprio progetto. Usando questo file puoi scegliere come target qualsiasi dispositivo che vuoi supportare senza dover conoscere le specifiche di ciò che i dispositivi inviano nelle loro intestazioni. Questo file ha già fatto il lavoro per te. Quindi si utilizza la proprietà Request.Browser per personalizzare la vista che si desidera restituire.
Successivamente, trovare una strategia su come si desidera organizzare le visualizzazioni nella cartella Visualizzazioni.Preferisco lasciare la versione desktop alla radice e quindi avere una cartella Mobile. Ad esempio, la cartella di vista iniziale sarebbe simile a questa:
Non sono d'accordo con @Mehrdad sull'utilizzo di un motore di visualizzazione personalizzata. Il motore di visualizzazione ha più di uno scopo e uno di questi è trovare le viste per il controller. Puoi farlo sostituendo il metodo FindView. Con questo metodo, puoi verificare dove trovare la vista. Dopo aver saputo quale dispositivo sta utilizzando il tuo sito, puoi utilizzare la strategia che hai scelto per organizzare le tue visualizzazioni per restituire la visualizzazione per quel dispositivo.
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;
}
}
Il codice sopra consente di impostare la vista in base alla propria strategia. Il fall back è la vista desktop, se non è stata trovata alcuna vista per il dispositivo o se non c'è una vista mobile predefinita.
Se si decide di inserire la logica nel controller anziché creare un motore di visualizzazione. L'approccio migliore sarebbe quello di creare una personalizzata ActionFilterAttribute con cui decorare il controller. Quindi, ignora il metodo OnActionExecuted per determinare quale dispositivo sta visualizzando il tuo sito. Puoi controllare questo blog post su come. Il post contiene anche alcuni link utili ad alcuni video Mix su questo argomento.
non funzionerà con T4MVC, si assume il viewname è solo un nome e non un percorso. inoltre non funzionerà in modalità di rilascio a causa della memorizzazione nella cache. –
Non l'ho provato da quando è stato rilasciato T4MVC. Questo era prima che fosse disponibile. Quando avrò tempo, aggiornerò la risposta per riflettere i miei risultati durante i test contro T4MVC. –
Carl, cosa intendi con il caching? Questo approccio è identico a ciò che Scott Hanselman descrive qui: http://www.hanselman.com/blog/MixMobileWebSitesWithASPNETMVCAndTheMobileBrowserDefinitionFile.aspx e lui non lo menziona. – roufamatic