Actualización: Esta solución tiene un error sutil. El framework MVC llamará al FindView
/FindPartialView
dos veces: una vez con useCache=true
, y si eso no arroja un resultado, una vez con useCache=false
. Como solo hay un caché para todos los tipos de vistas, los usuarios de dispositivos móviles pueden terminar viendo vistas de escritorio si el navegador de escritorio fue el primero en llegar.
Para aquellos interesados en el uso de motores de vista personalizada para resolver este problema, Scott Hanselman ha actualizado su solución aquí:
http://www.hanselman.com/blog/ABetterASPNETMVCMobileDeviceCapabilitiesViewEngine.aspx
(Disculpas por el secuestro respuesta, simplemente no quieren que nadie más lo tienen que pasar por esto!)
Editado por roufamatic (2010-11-17)
Lo primero que debe hacer es introducir el Mobile Device Browser File en su proyecto. Al usar este archivo, puede orientarse a cualquier dispositivo que desee admitir sin tener que conocer los detalles de lo que esos dispositivos envían en sus encabezados. Este archivo ya ha hecho el trabajo por usted. A continuación, utiliza la propiedad Request.Browser para personalizar la vista que desea devolver.
A continuación, presente una estrategia sobre cómo desea organizar sus vistas en la carpeta Vistas.Prefiero dejar la versión de escritorio en la raíz y luego tener una carpeta móvil. Por ejemplo, la carpeta de vista inicial se vería así:
puedo estar de acuerdo con @Mehrdad sobre el uso de un motor de vista personalizada. El motor de vista cumple más de un propósito y uno de esos propósitos es encontrar vistas para el controlador. Para ello, anule el método FindView. En este método, puede hacer sus comprobaciones sobre dónde encontrar la vista. Una vez que sepa qué dispositivo está usando su sitio, puede usar la estrategia que se le ocurrió para organizar sus vistas y devolver la vista para ese 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;
}
}
El código anterior le permite configurar la vista en función de su estrategia. El retroceso es la vista de escritorio, si no se encontró vista para el dispositivo o si no hay una vista móvil predeterminada.
Si decide poner la lógica en su controlador en lugar de crear un motor de vista. El mejor enfoque sería crear un ActionFilterAttribute personalizado con el que pueda decorar su controlador. Luego, anule el método OnActionExecuted para determinar qué dispositivo está viendo su sitio. Puede consultar esto blog post sobre cómo hacerlo. La publicación también tiene algunos buenos enlaces a algunos videos Mix sobre este mismo tema.
no funcionará con T4MVC, usted asume el nombredevista es sólo un nombre y no un camino. tampoco funcionará en el modo de lanzamiento debido al almacenamiento en caché. –
No lo he probado desde que se lanzó T4MVC. Esto fue antes de que estuviera disponible. Cuando tenga tiempo, actualizaré la respuesta para reflejar mis resultados cuando realice pruebas contra T4MVC. –
Carl, ¿qué quiere decir con el almacenamiento en caché? Este enfoque es idéntico al que describe Scott Hanselman aquí: http://www.hanselman.com/blog/MixMobileWebSitesWithASPNETMVCAndTheMobileBrowserDefinitionFile.aspx y él no lo menciona. – roufamatic