특정 URL이 주어지면 어떤 컨트롤러 액션이 라우팅되는지 확인하려면 어떻게해야합니까? (컨트롤러가 많은 대형 응용 프로그램의 컨텍스트에서) 및 복잡한 경로 레지스트리)?ASP.NET MVC에서 특정 URL을 처리 할 컨트롤러와 액션 결정
경로 구성 방법을 묻지 않습니다..
특정 URL이 주어지면 어떤 컨트롤러 액션이 라우팅되는지 확인하려면 어떻게해야합니까? (컨트롤러가 많은 대형 응용 프로그램의 컨텍스트에서) 및 복잡한 경로 레지스트리)?ASP.NET MVC에서 특정 URL을 처리 할 컨트롤러와 액션 결정
경로 구성 방법을 묻지 않습니다..
뭔가 :
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");
}
사용되는 컨트롤러 및 동작은 등록 된 경로에 의해 결정됩니다. 귀하의 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);
}
}
그것은 URL을
기본 규칙을 해결하기 위해 등록 된 경로에 따라입니다. 세드릭 당신이 결정하는 actionfilter를 사용하여 코드에서
,
이 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; 컨트롤러에 대한이 같은
피트 :
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;
}
}
}
을 다음 각 장식
모든 컨트롤러에 관심이 있습니다. –
피트 - 그러면 [AddUrlInfoToSessionAttribute] 플래그를 사용하여 모든 컨트롤러를 장식해야합니다. 이것은 기존 코드베이스에 따라 큰 이슈가 될 수도 있고 그렇지 않을 수도 있습니다. 실제로 이전의 경로 데이터를 추적하기 위해 몇 가지 앱에서 위 코드의 더 많은 기능을 갖춘 버전을 사용하므로 잘 작동합니다. –
대부분의 경우 앱에 일반적으로 사용되는 기본 클래스가있을 것이라고 생각합니다. 그렇다면이 아이디어가 도움이 될 수 있다면 ... 작동 해 보겠습니다. –
두 가지 간단한 단계 :
MvcFakes.dll,RouteDebugger.dll
/RouteDebugger
을 here
Chapter09Code.zip \ Code \ CS \ MvcApplication1 \ MvcApplication1 \ bin
큰 감사드립니다 - 이것은 간단하고 유용합니다. 단점은 모든 컨트롤러가 공통 기본 클래스에서 안정적으로 상속된다는 가정입니다. –
나는 게시물을 편집했다. 기본 컨트롤러 클래스를 만들지 않으려면 대신 global.asax를 사용할 수 있습니다. – wassertim