2010-11-12 17 views
11

Estoy buscando una forma de hacer cumplir la acción de un controlador para acceder solo a través de una solicitud AJAX.ASP.NET MVC: Aplicar la solicitud AJAX en una acción

¿Cuál es la mejor manera de hacer esto antes de llamar al método de acción? Quiero refactorizar lo siguiente de mis métodos de acción:

if(Request.IsAjaxRequest()) 
    // Do something 
else 
    // return an error of some sort 

Lo que estoy es una previsión de ActionMethodSelectorAttribute que puede ser utilizado como el atributo [AcceptVerbs]. Sin embargo, no tengo experiencia en crear un atributo tan personalizado.

Respuesta

17

Crear ActionFilter que los incendios OnActionExecuting

public class AjaxActionFilter : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (!filterContext.HttpContext.Request.IsAjaxRequest()) 
      filterContext.Result = new RedirectResult(//path to error message);   
    } 
} 

Al establecer la propiedad Resultado del filtro impedirá la ejecución de la ActionMethod.

A continuación, puede aplicarlo como un atributo a su ActionMethods.

+0

+1, de las maneras presentadas, este es por mucho el más cercano a mi enfoque preferido y es extensible, especialmente si se encuentra en un controlador de base que todos los demás heredan de –

2

Es tan simple como esto:

public class AjaxOnly : ActionMethodSelectorAttribute 
{ 
    public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo) 
    { 
     return controllerContext.HttpContext.IsAjaxRequest(); 
    } 
} 

simplemente me olvido de donde IsAjaxRequest() proviene de, estoy pegando de código que tengo, pero "perdido" ese método. ;)

+0

Ooops, no obtuvo la parte sobre devolviendo un error Esto hace que el método nunca obtenga el suyo a menos que la solicitud sea Ajax. Solo otra forma de hacerlo. – jfar

+0

Sé que esta respuesta se publicó hace unos aaaaages, pero IsAjaxRequest cuelga el objeto de solicitud, no el Httpcontext. – heymega

Cuestiones relacionadas