2010-11-12 12 views
11

Je cherche un moyen d'appliquer l'action d'un contrôleur à un accès uniquement via une requête AJAX.ASP.NET MVC: Appliquer la requête AJAX à une action

Quelle est la meilleure façon de procéder avant d'appeler la méthode d'action? Je veux factoriser les éléments suivants de mes méthodes d'action:

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

Ce que je suis envisioning est un ActionMethodSelectorAttribute qui peut être utilisé comme l'attribut [AcceptVerbs]. Je n'ai pas d'expérience dans la création d'un tel attribut personnalisé.

Répondre

17

Créer un ActionFilter qui se déclenche OnActionExecuting

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

Réglage de propriété Résultat du filtre empêche l'exécution du ActionMethod.

Vous pouvez ensuite l'appliquer en tant qu'attribut à vos méthodes ActionMethods.

+0

+1, des façons présentées, c'est de loin et de loin celui le plus proche de mon approche préférée et est extensible, surtout si situé dans un basecontroller que tous les autres héritent de –

2

est aussi simple que cela:

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

J'oublie juste où vient, IsAjaxRequest() Je suis coller du code que j'ai mais « perdu » cette méthode. ;)

+0

Ooops, n'a pas eu la partie renvoyer une erreur Cela fait que la méthode ne l'obtiendra jamais à moins que la requête ne soit Ajax. Juste une autre façon de le faire. – jfar

+0

Je sais que cette réponse a été postée il ya aaaaaages mais le IsAjaxRequest se bloque l'objet de demande pas le Httpcontext. – heymega