2012-02-21 6 views

risposta

21

non mi ricordo dove ho ricevuto questo da, ma mi è stato guardando intorno per qualcosa di simile un po 'indietro e ha trovato un articolo o qualcosa da qualche parte che conteneva questo filtro di registrazione:

public class LogActionFilter : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     Log("OnActionExecuting", filterContext.RouteData); 
    } 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     Log("OnActionExecuted", filterContext.RouteData); 
    } 

    public override void OnResultExecuting(ResultExecutingContext filterContext) 
    { 
     Log("OnResultExecuting", filterContext.RouteData); 
    } 

    public override void OnResultExecuted(ResultExecutedContext filterContext) 
    { 
     Log("OnResultExecuted", 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"); 
    } 
} 

per usarlo, basta aggiungerlo ai filtri globali in global.asax:

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

Ora avrò uno sguardo per vedere se riesco a trovare la fonte.

Modifica: Trovato. Era dal this question.

4

A seconda della dimensione del sito, è possibile creare una classe nella gerarchia tra la classe Controller del framework e i controller principali.

Qualcosa di simile

public class MyBaseController : Controller { 
    protected override void OnActionExecuting(ActionExecutingContext filterContext) { 
     // your logging stuff here 
     base.OnActionExecuting(filtercontext); 
    } 
} 

Poi il resto dei controller può ereditare da questo, ad esempio,

public class HomeController : MyBaseController { 
    // action methods... 
} 
2

È possibile utilizzare la propria fabbrica di controller e registrarlo così: Da: (molti esempio sulla rete - inserire la registrazione in cui si desidera)

adattato da: http://www.keyvan.ms/custom-controller-factory-in-asp-net-mvc

 
using System; 
using System.Configuration; 
using System.Web.Mvc; 
using System.Web.Routing; 

namespace IControllerFactorySample.ControllerFactories 
{ 
    public class YourControllerFactory : IControllerFactory 
    { 
     #region IControllerFactory Members 

     public IController CreateController(RequestContext requestContext, string controllerName) 
     { 
      if (string.IsNullOrEmpty(controllerName)) 
       throw new ArgumentNullException("controllerName"); 

      IController controller = Activator.CreateInstance(Type.GetType(controllerName)) as IController; 

      return controller; 
     } 

     public void ReleaseController(IController controller) 
     { 
      if (controller is IDisposable) 
       (controller as IDisposable).Dispose(); 
      else 
       controller = null; 
     } 

     #endregion 
    } 
}

non dimenticare per registrarlo in global.asax.cs

ControllerBuilder.Current.SetControllerFactory(
       typeof(YourControllerFactory)); 
+0

PS si può anche utilizzare un metodo di programmazione orientata agli aspetti (AOP) e iniettare tramite postsharp o spring.net ha un motore che puoi usare per intercettare anche le chiamate (che va oltre il controller ma puoi impostare una regex nel file di configurazione per applicare credo nelle classi con un nome "Controller" su di esse. –

Problemi correlati