Comment écrire une action de filtre pour tous les contrôleurs
Voici un exemple de l'action du filtre. Nous savons que lorsque nous écrivons une action de filtre alors nous avons besoin pour décorer le contrôleur avec un attribut comme cela, à l'utiliser pour n'importe quel contrôleur.
Je voudrais savoir si il existe un moyen d'écrire une action de filtre qui va travailler pour tous les contrôleurs de sorte que je n'ai pas besoin de décorer toutes les contrôleurs avec une action de filtre d'attribut. Des idées?
[LogActionFilter]
public class HomeController : Controller
{}
public class LogActionFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
Log("OnActionExecuting", filterContext.RouteData);
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
Log("OnActionExecuted", filterContext.RouteData);
}
private void Log(string methodName, RouteData routeData)
{
var controllerName = routeData.Values["controller"];
var actionName = routeData.Values["action"];
var message = String.Format("{0} controller:{1} action:{2}", methodName, controllerName, actionName);
Debug.WriteLine(message, "Action Filter Log");
}
}
OriginalL'auteur Thomas | 2014-09-25
Vous devez vous connecter pour publier un commentaire.
oui, devrait mettre en œuvre IActionFilter. En fait, vous pouvez voir l'HandleErrorAttribute inscrit dans FilterConfig.cs qui est généré automatiquement lorsque vous créez une application MVC.
mettre en œuvre IActionFilter signifie? mon tout contrôleur de la nécessité d'étendre IActionFilter ?? pas très clair ce que tu essaye de faire. si possible, inclure un petit code complet. merci
voir mise à jour.
merci. mon LogActionFilterAttribute étendre cette classe ActionFilterAttribute mais vous étendre IActionFilter pourquoi ?? quelle est la différence entre ActionFilterAttribute & IActionFilter ? qui peux me guider dans les détails. merci
OriginalL'auteur Jason Li
Pour votre scénario, vous pouvez simplement faire un Personnalisé BaseController et de mettre votre
[LogActionFilter]
attribut sur Personnalisé Basecontroller et hériter de tous vos Contrôleurs de Personnalisé Basecontroller comme indiqué ci-dessous :L'avantage de cette approche est que vous devez mettre votre personnalisé
[LogActionFilter]
attribut qu'à un endroit c'est à dire uniquement sur la Coutume BaseController.mise à jour de réponse.
ici, j'ai vu u décorer MyBaseController avec LogActionFilter et de nouveau a écrit OnActionExecuting() de la routine dans basecontroller ensuite comment le LogActionFilter code devrait ressembler. dans ma question, j'ai écrit OnActionExecuting() de la routine dans LogActionFilter classe. ai-je besoin de répéter LogActionFilter code en 2 ??
vous avez juste à décorer baseController avec l'attribut et sa fait..
Vous n'avez même pas besoin de l'attribut. Si vous avez un
BaseController
à partir de laquelle vos autres contrôleurs de la sous-classe, vous pouvez directement remplacerOnActionExecuting
et tous les autres d'action de la méthode de filtrage.OriginalL'auteur Kartikeya Khosla
Si vous êtes déjà sous-classement à partir d'un contrôleur de base, vous n'avez pas besoin d'un filtre d'attribut ou d'enregistrer quoi que ce soit. Vous pouvez simplement remplacer le désiré des méthodes, par exemple,
Ensuite, chaque contrôleur de sous-classes de il sera exécuté cette méthode:
Son point de vue tout à fait heureux de voir le
ViewBag.SomeValue
valeur.Je vous encourage à réfléchir à votre utilisation de
ViewBag
, plus précisément, comment votre web app de travail lorsqu'il est exécuté sur plusieurs serveurs exécutant dans différentes parties du monde, et chaque demande d'un client particulier peut ou ne peut pas aller sur le même serveur? Même si votre infrastructure de routage (y compris les équilibreurs de charge) est affine d'un client à un serveur en particulier, il y aura toujours des cas limites. Il suffit de penser que soigneusement...Je pensais que ce serait un problème donc je vous remercie de votre suivi de commentaires et de confirmation de ma préoccupation. Je n'ai pas compris comment faire pour éviter d'utiliser le ViewBag puisque les données fournies coupe à travers toutes les méthodes d'action et le contrôleur de base n'est pas au courant de la méthode spécifique de données. Mais je n'ai capturer les données par l'utilisateur. Cela fait-il sens?
c'est bien de faire ce que vous faites, ne vous arrêtez pas. Mon avis n'était pas un dur en garde contre les ViewBag utilisation. Il suffit de garder présent à l'esprit que vous apprenez dans votre carrière et de les garder à la recherche de ces compromis que vous avez à gérer. Lire et étudier, trouver des articles, et de poser des questions. C'est tout!
OriginalL'auteur ErikE