2010-04-14 6 views

답변

16

뭔가 :

string controller = RouteData.GetRequiredString("controller"); 

그리고 행동 :

string action = RouteData.GetRequiredString("action"); 

당신은 당신의 기본 컨트롤러 클래스에서 사용할 수 있습니다 예를 들어 :

public class YouControllerBase: Controller 
    { 
      protected override void Execute(System.Web.Routing.RequestContext requestContext) 
      { 
       string controller = requestContext.RouteData.GetRequiredString("controller"); 
       string action = requestContext.RouteData.GetRequiredString("action"); 
      } 
    } 

또는 사용 글로벌.asax :

protected void Application_BeginRequest(object sender, EventArgs e) 
    { 
     RouteData routeData = RouteTable.Routes.GetRouteData(
      new HttpContextWrapper(HttpContext.Current)); 
     var action = routeData.GetRequiredString("action"); 
    } 
+0

큰 감사드립니다 - 이것은 간단하고 유용합니다. 단점은 모든 컨트롤러가 공통 기본 클래스에서 안정적으로 상속된다는 가정입니다. –

+0

나는 게시물을 편집했다. 기본 컨트롤러 클래스를 만들지 않으려면 대신 global.asax를 사용할 수 있습니다. – wassertim

0

사용되는 컨트롤러 및 동작은 등록 된 경로에 의해 결정됩니다. 귀하의 Global.ascx.cs을보십시오

다음은 새로운 MVC 응용 프로그램에 기본으로 제공되는 기본 경로 매핑입니다. 따라서 URL이 http://yourdomain/SomeSiteSection/SomeThing/이면 MVC는 SomeSiteSectionController라는 컨트롤러와 SomeThing이라는 액션을 찾습니다.

public class MvcApplication : System.Web.HttpApplication 
    { 
     public static void RegisterRoutes(RouteCollection routes) 
     { 
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

      routes.MapRoute(
       "Default",            // Route name 
       "{controller}/{action}/{id}",       // URL with parameters 
       new { controller = "Home", action = "Index", id = "" } // Parameter defaults 
      ); 

     } 

     protected void Application_Start() 
     { 
      RegisterRoutes(RouteTable.Routes); 
     } 
    } 

인덱스 작업이 HomeController에 호출됩니다 다음과 같이

public class MvcApplication : System.Web.HttpApplication 
{ 

    //... 

    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "Default",            // Route name 
      "{controller}/{action}/{id}",       // URL with parameters 
      new { controller = "Home", action = "Index", id = "" } // Parameter defaults 
     ); 

    } 

    protected void Application_Start() 
    { 
     RegisterRoutes(RouteTable.Routes); 
    } 
} 
9

ASP.NET Routing Debugger을 시도 할 수 아래에 관심이있는 컨트롤러 (또는 basecontroller에 넣으십시오) :

[HandleError] 
[AddUrlInfoToSessionAttribute] 
public class HomeController : Controller 
{ 
    // controller stuff 
} 

[AddUrlInfoToSession] 
public abstract class BaseController : Controller 
{ 

} 

희망이 도움이

편집 : 단지 정돈 예까지 필터 메서드에 다음을 추가하여 비트 :

문자열 URL = RouteTable.Routes.GetVirtualPath (filterContext.RequestContext, currentRouteData.Values) .VirtualPath; 컨트롤러에 대한이 같은

2

피트 :

public class AddUrlInfoToSessionAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (!filterContext.HttpContext.Request.IsAjaxRequest()) 
     { 
      // where we are now - do something with the vars in real app 
      var currentActionName = filterContext.ActionDescriptor.ActionName; 
      var currentControllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName; 
      var currentRouteData = filterContext.RouteData; 
      var currentUrlInfo = new UrlHelper(filterContext.RequestContext); 
      string url = RouteTable.Routes.GetVirtualPath(filterContext.RequestContext, currentRouteData.Values).VirtualPath; 
     } 
    } 
} 

을 다음 각 장식

+0

모든 컨트롤러에 관심이 있습니다. –

+0

피트 - 그러면 [AddUrlInfoToSessionAttribute] 플래그를 사용하여 모든 컨트롤러를 장식해야합니다. 이것은 기존 코드베이스에 따라 큰 이슈가 될 수도 있고 그렇지 않을 수도 있습니다. 실제로 이전의 경로 데이터를 추적하기 위해 몇 가지 앱에서 위 코드의 더 많은 기능을 갖춘 버전을 사용하므로 잘 작동합니다. –

+0

대부분의 경우 앱에 일반적으로 사용되는 기본 클래스가있을 것이라고 생각합니다. 그렇다면이 아이디어가 도움이 될 수 있다면 ... 작동 해 보겠습니다. –

1

두 가지 간단한 단계 :

  1. 프로젝트에이 참조를 추가 MvcFakes.dll,RouteDebugger.dll
  2. 을 다음 URL 입력 : 2 개의 DLL을 포함 /RouteDebugger

here

Chapter09Code.zip \ Code \ CS \ MvcApplication1 \ MvcApplication1 \ bin

관련 문제