2011-05-30 12 views
5

Quiero redirigir al usuario a una vista diferente si está utilizando un navegador móvil. Decidí que me gustaría hacer esto utilizando filtros MVC aplicándolo a las acciones en las que quiero tener una vista móvil.Cambiar la vista en un filtro ASP.NET MVC

Creo que esta redirección debe ocurrir en OnActionExecuted, sin embargo, el filterContext no contiene información sobre la vista, pero sí en OnResultExecuted, pero en este momento creo que ya es demasiado tarde para cambiar la vista.

¿Cómo puedo interceptar el nombre de vista y cambiar ViewResult?

Esto es lo que tengo en el resultado ejecutado y en lo que me gustaría tener trabajo en Acción Ejecutada.

public class MobilePageFilter : ActionFilterAttribute 
{ 
    public override void OnResultExecuted(ResultExecutedContext filterContext) 
    { 
     if(filterContext.Result is ViewResult) 
     { 
      if (isMobileSite(filterContext.HttpContext.Session[SetMobile.SESSION_USE_MOBILE])) 
      { 
       ViewResult viewResult = (ViewResult)filterContext.Result; 

       string viewName = viewResult.ViewName; 
       filterContext.Result = new ViewResult 
       { 
        ViewName = "Mobile/" + viewName, 
        ViewData = viewResult.ViewData, 
        TempData = viewResult.TempData 
       }; 
      } 
     } 

     base.OnResultExecuted(filterContext); 
    } 
} 
+0

Agregue reglas de ruta en Global.cs – zsong

Respuesta

4

le recomiendo que la following blog post que explica una mejor alternativa para lograr lo que usted está pidiendo en lugar de utilizar filtros de acción.

+0

Gracias, solución completamente diferente pero funciona muy bien. – Sam

3

Esto es lo que terminé haciendo, y envuelto en un atributo reutilizable y la gran cosa es que conserva la URL original, mientras que la reorientación (o la aplicación de cualquier resultado que se desea) en función de sus necesidades:

public class AuthoriseSiteAccessAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     base.OnActionExecuting(filterContext); 

     // Perform your condition, or straight result assignment here. 
     // For me I had to test the existance of a cookie. 
     if (yourConditionHere) 
      filterContext.Result = new SiteAccessDeniedResult(); 
    } 

} 

public class SiteAccessDeniedResult : ViewResult 
{ 
    public SiteAccessDeniedResult() 
    { 
     ViewName = "~/Views/SiteAccess/Login.cshtml"; 
    } 
} 

Luego, simplemente agregue el atributo [SiteAccessAuthorise] a sus controladores a los que desea aplicar el acceso de autorización (en mi caso) o agréguelos a un BaseController. Asegúrate de que la acción que estás redireccionando al controlador subyacente no tenga el atributo, ¡o te atraparán en un bucle infinito!

Cuestiones relacionadas