2012-02-21 2 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 
    } 
}

잊지 말아

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

추 신 : AOP (aspect oriented programming)의 일부 방법을 사용하여 postsharp 또는 spring.net을 통해 주입 할 수 있습니다. 당신은뿐만 아니라 컨트롤러를 넘어 간다 그러나 당신은 그 (것)들에 "제어기"이름을 가진 종류에 믿는 적용하기 위하여 조정 파일에있는 정규식을 놓을 수있는 또한 외침을 도청하기 위하여 당신이 수있는 엔진. –

관련 문제