2011-05-05 22 views
7

Al crear un filtro de acción ASP.MVC 3 personalizado, ¿cómo debo redirigir al usuario a otra acción si falla mi prueba? Me gustaría pasar la Acción original para que pueda volver a dirigirme a la página original después de que el usuario ingrese la preferencia que falta.¿Cómo redirecciono al usuario a otra acción del controlador desde un filtro de acción ASP.MVC 3?

En el regulador:

[FooRequired] 
public ActionResult Index() 
{ 
    // do something that requires foo 
} 

en una clase de filtro personalizado:

// 1. Do I need to inherit ActionFilterAttribute or implement IActionFilter? 
public class FooRequired : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (TestForFoo() == false) 
     { 
      // 2. How do I get the current called action? 

      // 3. How do I redirect to a different action, 
      // and pass along current action so that I can 
      // redirect back here afterwards? 
     } 

     // 4. Do I need to call this? (I saw this part in an example) 
     base.OnActionExecuting(filterContext);    
    } 
} 

Busco un ejemplo sencillo filtro de ASP.MVC 3. Hasta el momento, mis búsquedas han dado lugar a ejemplos de Ruby on Rails o ASP.MVC filter mucho más complicados de lo que necesito. Me disculpo si esto se ha preguntado antes.

+0

posible duplicado de [ASP.NET MVC 3 redirigir desde el atributo de filtro de acción] (http://stackoverflow.com/questions/5453338/asp-net-mvc-3-redirect-from-action-filter-attribute) – Talljoe

+1

Eso responde seguramente a parte de mi pregunta. No lo conseguí en mi búsqueda de StackOverflow antes de preguntar. Todavía me pregunto cómo pasar la Acción existente. –

+0

@Talljoe y mods: más parecido a un posible duplicado de [Redirigir a controlador y acción especificados en el filtro de acción asp.net mvc] (http://stackoverflow.com/questions/1490401/redirecting-to-specified-controller-and- action-in-asp-net-mvc-action-filter) –

Respuesta

6

Puede configurar el filterContext.Result a un RedirectToRouteResult:

filterContext.Result = new RedirectToRouteResult(...); 
+1

Esto funciona para mí, con la excepción de que todavía estoy tratando de descubrir cómo pasar la ruta actual para saber qué acción fue interrumpida. –

+0

Supongo que este es el ingrediente que falta: http://www.squaredroot.com/2008/04/01/redirecttoaction-with-parameter/ –

7

Aquí está un ejemplo de código pequeño usando uno de mis propios filtros de redirección:

public class PrelaunchModeAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     //If we're not actively directing traffic to the site... 
     if (ConfigurationManager.AppSettings["PrelaunchMode"].Equals("true")) 
     { 
      var routeDictionary = new RouteValueDictionary {{"action", "Index"}, {"controller", "ComingSoon"}}; 

      filterContext.Result = new RedirectToRouteResult(routeDictionary); 
     } 
    } 
} 

Si desea interceptar la ruta, puede obtenerlo del ActionExecutingContext.RouteData member.

Con ese miembro RouteData, puede obtener la ruta original:

var currentRoute = filterContext.RouteData.Route; 

Etc ... ¿Tiene que ayudar a responder a su pregunta?

+0

¿Cómo usaste filterContext.RouteData.Route? Intenté el nuevo RedirectToRouteResult (filterContext.RouteData.Route). – stormwild

Cuestiones relacionadas