2011-08-22 2 views
2

J'ai défini un attribut d'autorisation personnalisé. Afin d'éviter l'attribut liste ci-dessus chaque ActionResult dans mon contrôleur (s), j'ai ajouté l'attribut à mon global.asax comme suit:Y a-t-il un moyen de RegisterGlobalFilters, mais exclure les requêtes JsonResult?

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new MyAuthorizeAttribute()); 
} 

Une conséquence non intentionnelle de cela, cependant, est que mon autorisation le code est appelé pendant tous mes appels JsonResult. Y a-t-il un moyen pour que MyAuthorizeAttribute soit invoqué UNIQUEMENT sur les appels ActionResult et NON sur les appels JsonResult? J'utilise MVC3.

Répondre

1

Le filtre fonctionne-t-il avant ou après la méthode d'action? Si elle s'exécute avant, vous ne pouvez pas savoir quel type concret sera renvoyé, car toutes les actions retournent ActionResult (sauf si vous renvoyez spécifiquement JsonResult - c'est une autre histoire).

Si elle court après la méthode d'action, puis dans votre chèque de code de filtre si le résultat est un JsonResult, comme ça:

public override void OnResultExecuting(ResultExecutingContext filterContext) 
    { 
     if (!(filterContext.Result is JsonResult)) 
     { 
      // do whatever you want... 
     } 

     base.OnResultExecuting(filterContext); 
    } 
+0

Je renvoie spécifiquement JsonResult avec certaines de mes méthodes de contrôleur. – WEFX

+0

Je ne sais pas comment identifier le type de retour de l'action (en plus de la réflexion qui sera coûteuse) et de toute façon, vous n'allez pas éviter l'exécution du code du filtre, même s'il ne fait rien par la suite. Mais mon exemple de code peut toujours fonctionner pour vous - si quelque chose est JsonResult, le filtre ne fait rien. –

0

Je suis en désaccord avec la réponse précédente. Vous semblez avoir approché cela du mauvais côté. Vous devriez regarder le type de demande , pas le type de retour .

Vous pouvez vérifier les demandes Ajax avant l'action dans votre filtre. Vous devriez avoir quelque chose comme ça ...

public class MyAuthorizeAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (filterContext.HttpContext.Request.IsAjaxRequest()) 
      return; 

     // else do authorisation stuff... 
    } 
} 
Questions connexes