2012-02-21 45 views

回答

21

我不記得在那裏我得到這個從,但我四周尋找類似的東西了一段時間後,發現了一個

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

要使用它,只需將其添加到全局過濾器在Global.asax中:包含此日誌記錄的過濾器製品或一些地方

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

我現在來看看是否可以找到源代碼。

編輯:找到它。這是從this question

4

根據網站已經有多大,您可以在框架的Controller類和您的主控制器之間的層次結構中創建一個類。

喜歡的東西

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

然後你的控制器的其餘部分可以由這一點,例如繼承

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

您可以使用自己的控制器工廠並將其註冊爲好: 來源:(在網絡上大量的實例 - 插入您想要記錄)改編自

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 
    } 
}

不要忘記在global.asax.cs中註冊它

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

PS你也可以使用面向方面編程(AOP)的一些方法並通過postsharp或spring.net注入你也可以使用一個引擎來攔截調用(它不僅僅是控制器,而且你可以在配置文件中設置一個正則表達式,我相信這些正則表達式可以應用到名字爲'Controller'的類上。 – 2012-05-22 14:17:15

相關問題