2012-02-21 15 views

cevap

21

ben bu nereden aldı hatırlamıyorum ama bir süre önce benzer bir şey etrafa ve bir bulunmuştur

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

sadece global.asax içinde küresel filtreler eklemek, kullanmak için: Bu günlüğü filtresi bulunan makale ya da bir yere bir şey

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

Kaynağı bulabileceğimi görmek için şimdi bir bakacağım.

Düzeltme:this question idi.

4

Sitenin ne kadar büyük olduğuna bağlı olarak, çerçevenin Controller sınıfı ve ana denetleyicileri arasındaki hiyerarşide bir sınıf oluşturabilirsiniz.

şey

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

gibi Sonra kontrolörleri geri kalanı bu, örneğin dan devralabilir

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

Kendi kontrolör fabrika kullanmak ve de kayıt olabilirsiniz: Gönderen : - (net birçok örnekte istediğiniz günlüğü ekleyin)

uyarlanmıştır: 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 
    } 
}

unutma onu kaydetmek için global.asax.cs

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

PS ayrıca yönelimli programlama (AOP) ve postharp veya spring.net ile enjekte bazı yöntemlerini de kullanabilirsiniz Çağrıları engellemek için kullanabileceğiniz bir motor (sadece kontrol cihazının ötesine geçiyor ancak konfigürasyon dosyasında bir regex ayarlayabiliyorsunuz). –

İlgili konular