2012-02-21 29 views

Respuesta

21

No puedo recordar donde me dieron esto desde, pero yo estaba mirando a su alrededor para algo similar hace un tiempo y encontró una artículo o algo en alguna parte que contenía el registro de este filtro:

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"); 
    } 
} 

para usarlo, basta con añadir a los filtros globales en global.asax:

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

Echaré un vistazo ahora para ver si puedo encontrar la fuente.

Editar: Lo encontró. Era de this question.

4

Dependiendo de cuán grande sea el sitio, puede crear una clase en la jerarquía entre la clase Controller del marco y sus controladores principales.

Algo así como

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

A continuación, el resto de los controladores puede heredar de esto, por ejemplo,

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

Usted puede utilizar su propia fábrica de control y registro que así: De: (muchos ejemplos en la red - insertar el registro en el que desea)

adaptado de: 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 
    } 
}

No se olvide para registrarlo en global.asax.cs

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

PS también puede usar algún método de programación orientada a aspectos (AOP) e inyectar a través de postsharp o spring.net tiene un motor que puede usar para interceptar llamadas también (que va más allá del controlador, pero puede establecer una expresión regular en el archivo de configuración para aplicar, creo, a clases con un nombre 'Controlador' en ellas). –

Cuestiones relacionadas