2012-06-21 3 views
0

Comment utiliseriez-vous l'ActionFilterAttribute lorsque vous appelez une méthode de contrôleurs directement? Imaginez ce qui suit:MVC 3 méthode de contrôleur d'appel directement, mais aussi appeler le ActionFilterAttribute?

public class ApiController : Controller { 

    public ActionResult CallSomething() { 
     return IsCalled(); 
    } 

    [MyAction] 
    public ActionResult IsCalled() { 
     return View(); 
    } 
} 

Ainsi, la demande vient en /Api/CallSomething, la méthode CallSomething() appelle en interne une autre méthode (dans ce cas IsCalled()), mais lorsque cette méthode est appelée la ActionFilterAttribute est invoquée et fonctionne. À l'heure actuelle, ActionFilterAttribute ne sera invoqué que s'il fait partie de la requête d'origine, ce qui est logique car cela fait partie du cycle de vie complet de MVC et je ne fais qu'appeler une méthode directement, j'aurais besoin faire un RedirectToAction si je voulais qu'il soit viré par MVC. RedirectToAction modifie l'URL de sorte que cela ne convient pas à mes fins.

Je me suis piquée sur le code System.Web.Mvc mais je ne peux pas voir comment ou quand il est appelé. Je me dis que si cela peut le faire, alors je peux potentiellement utiliser la réflexion. Dans ce cas, les vues ne sont pas pertinentes car je remplace l'ExecuteResult() pour écrire mon propre contenu dans la réponse http.

De toute façon, je me suis résigné à ce que ce n'était peut-être pas possible, mais je pensais juste que ça vaut le coup d'essayer.

Répondre

1

Il n'y a pas de moyen pratiquement correct d'y parvenir. Alors n'essayez pas de le faire. Les actions du contrôleur ne doivent pas s'appeler comme dans votre exemple. Utilisez une redirection dans ce cas. Ou demandez au client d'envoyer la demande directement à la deuxième action si vous ne souhaitez pas la redirection.

Oh, et si vous avez des fonctionnalités communes entre les actions de contrôleurs que vous souhaitez réutiliser, externaliser simplement cette fonctionnalité dans une autre couche. Il existe plusieurs façons de fournir des fonctionnalités communes dans ASP.NET MVC 3 en fonction du scénario exact.

+0

Pourriez-vous suggérer une alternative élégante? – David

+0

J'ai déjà donné les 2 alternatives dans ma réponse: rediriger ou demander au client d'invoquer directement la seconde action. –

0

La façon la plus simple de faire ce dont vous parlez est juste de factoriser la fonctionnalité que vous voulez exécuter en tant que filtre et ad-hoc. Cela n'a aucun sens de forcer un filtre à s'exécuter là où il ne devrait pas être exécuté. Mais il pourrait être logique de vouloir appeler une partie du filtre ad-hoc. La façon la plus simple de le faire est une méthode ancienne statique simple:

public class ApiController : Controller { 

    public ActionResult CallSomething() { 
     MyActionFilter.CommonStaticMethodThatIsAlsoUsedInTheNormalFilter(); 
     return IsCalled(); 
    } 

    [MyActionFilter] 
    public ActionResult IsCalled() { 
     return View(); 
    } 
} 

Vous devriez être plus précis sur ce que vous essayez d'atteindre, il pourrait y avoir d'autres caractéristiques du cadre qui sont un meilleur ajustement.

Questions connexes