액션 필더 이해하기
이 장에서 목표는 액션 필더를 설명하는 것이다. 액션 필터는 여러분이 컨트롤러 액션을 응용할 수 있는 속성이다.
ASP.NET MVC 프레임웍은 여러 액션 필터를 포함한다.
l OutputCache – 이 액션 필터는 특정한 시간을 위한 컨트롤러 액션의 결과를 저장한다.
l HandleError – 이 액션 필터는 컨트롤러 액션이 실행될 때 발생하는 에러를 잡아낸다.
l Authorize – 이 액션 필터는 개개인의 사용자 또는 룰을 통해 접근을 제한할 수 있다.
여기서는 OutputCache 액션 필터에 대해서만 알아보겠다.
액션 필터는 attribute이다. 각각의 컨트롤러 또는 전체 컨트롤러에서 모두 액션 필터를 적용할 수 있다.
다음 예제는 Index() 액션의 결과를 10초동안 저장하는 예제이다.
//[OutputCache(Duration = 10)] 사이트소스ㅡㅡ)+ 에러발생아놔~ [OutputCache(Duration = 10, VaryByParam="none")] public string Index() { return DateTime.Now.ToString("T"); } |
주소창에 URL /Data/Index입력하고 리플래쉬를 하면 10초동안 동일한 시간을 보게 될 것이다.
OutputCache 액션 필터를 10초동안 Index() 페이지에 적용시켰다.
다른 타입의 필터
ASP.NET MVC 프레임웍은 4개의 다른 타입의 필터를 제공한다.
1. Authorization Filters – IauthorizationFilter 속성을 구현
2. Action Filter - IActionFilter 속성을 구현
3. Result Filter – IresultFilter 속성을 구현
4. Exception Filters – IexceptionFilter 속성 구현
필터는 위에 나열된 순서대로 실행이 된다.
Base ActionFilterAttribute Class
이 장에서는 여러분이 쉽게 커스텀 액션 필터, ASP.NET framework에 포함된 기본 ActionFilterAttribute 클래스로 구현을 쉽게 만들 것이다.
이 클래스는 필터 클래스로부터 상속 받는 IActionFilter와 IResultFilter 인터페이스 둘다 구현을 한다.
base ActionFilterAttribute 클래스는 다음과 같은 메서드를 override 할 수 있다.
l OnActionExecuting – 이 메소드는 컨트롤 액션 전에 실행이 된다.
l OnActionExecuted – 이 메소드는 컨트롤 액션 후에 실행이 된다.
l OnResultExecuting – 이 메소드는 컨트롤 액션 결과 전에 실행된다.
l OnResultExecuted – 이 메소드는 컨트롤 액션 결과 후에 실행된다.
Creating a Log Action Filter
이 장에서는 커스텀 액션 필터를 어떻게 만들지에 대해 설명한다.
우리는 Visual Studio Output 윈도우에 컨트롤 액션의 상태 단계 로그의 커스텀 액션 필터를 만들 것이다.
LogActionFilter는 Listing2에 포함되어 있다.
using System; using System.Diagnostics; using System.Web.Mvc; using System.Web.Routing; namespace MvcApplication1.ActionFilters { 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"); } } } |
Listing2에서 OnActionExcuting(), OnActionExcuted(), OnResultExecuting(), OnResultExecuted() 메소드를 Log()메소드에서 모두 호출한다.
메소드명과 정확한 라우트 데이터는 Log() 메소드를 통과한다.
Log() 메소드는 Visual Studio Output 윈도우에 메시지를 출력한다. ( 디버그 모드로 )
Home컨트롤러의 Index() 액션이든 아니든 Home컨트롤러에의 모든 액션에 대해서 동작을 한다.
그 동작된 내용을 Output창에 출력이 된다.
namespace ExamActionFilter.Controllers { //[HandleError] [LogActionFilter] public class HomeController : Controller { public ActionResult Index() { return View(); } public ActionResult About() { return View(); } } } |
여기까지 간단한 액션 필터를 구현하는 것을 배웠다.
'Web Platform' 카테고리의 다른 글
IsPostBack속성, 페이지 이벤트 주기 (0) | 2009.06.29 |
---|---|
에러) System.Web.HttpException: 최대 요청 길이를 초과했습니다. (0) | 2009.06.29 |
ASP.NET MVC 마스터 페이지 (0) | 2009.06.29 |
ASP.NET MVC TagBuilder (0) | 2009.06.29 |
ASP.NET MVC View (0) | 2009.06.29 |