IT이야기

ASP.NET MVC의 컨트롤러에서 경로 이름 얻는 방법

cyworld 2021. 10. 24. 21:22
반응형

ASP.NET MVC의 컨트롤러에서 경로 이름을 어떻게 얻을 수 있습니까?


ASP.NET MVC 경로에는 매핑될 때 이름이 있습니다.

routes.MapRoute(
    "Debug", // Route name -- how can I use this later????
    "debug/{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = string.Empty } );

위의 예에서 "디버그"와 같이 경로 이름을 얻는 방법이 있습니까? 컨트롤러의 OnActionExecuting에서 액세스하고 싶습니다. 예를 들어 URL 앞에 /debug/...


불행히도 경로 이름은 경로에 저장되지 않습니다. 컬렉션의 키로 MVC에서 내부적으로만 사용됩니다. 예를 들어 HtmlHelper.RouteLink로 링크를 생성할 때 이것이 여전히 사용할 수 있는 것이라고 생각합니다.

어쨌든, 나는 그것이 필요했고 여기에 내가 한 일이 있습니다.

public static class RouteCollectionExtensions
{
    public static Route MapRouteWithName(this RouteCollection routes,
    string name, string url, object defaults, object constraints)
    {
        Route route = routes.MapRoute(name, url, defaults, constraints);
        route.DataTokens = new RouteValueDictionary();
        route.DataTokens.Add("RouteName", name);

        return route;
    }
}

따라서 다음과 같이 경로를 등록할 수 있습니다.

routes.MapRouteWithName(
    "myRouteName",
    "{controller}/{action}/{username}",
    new { controller = "Home", action = "List" }
    );

내 컨트롤러 작업에서 다음을 사용하여 경로 이름에 액세스할 수 있습니다.

RouteData.DataTokens["RouteName"]

도움이 되기를 바랍니다.


아래와 같은 표준 MapRoute 설정을 사용하는 경우:

routes.MapRoute(    name: "Default",
                    url: "{controller}/{action}/{id}",
                    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }

...이것은 보기에서 작동합니다...

var routeName = Url.RequestContext.RouteData.Values["action"].ToString();

추가 매개변수의 기본값을 사용하여 경로 값을 통해 경로 이름을 전달할 수 있습니다.

routes.MapRoute(
    name: "MyRoute",
    url: "{controller}/{action}/{id}",
    defaults: new { routeName = "MyRoute", controller = "Home", action = "Index", id=UrlParameter.Optional }
);

그런 다음 컨트롤러 컨텍스트에서 전달된 값을 가져올 수 있습니다.

string routeName = ControllerContext.RouteData.Values["routeName"].ToString();

이것은 질문에 직접적으로 대답 하지 않습니다 (당신이 현학적이고 싶다면); 그러나 실제 목적은 경로 이름이 주어지면 경로의 기본 URL을 얻는 것 같습니다. 그래서, 이것이 내가 한 방법입니다.

내 경로는 다음과 RouteConfig.cs같이 정의 되었습니다.

routes.MapRoute(
            name: "MyRoute",
            url: "Cont/Act/{blabla}",
            defaults: new { controller = "Cont", action = "Act"}
        );

그리고 경로의 기본 URL을 얻으려면:

var myRoute = Url.RouteUrl("MyRoute", new { blabla = "blabla" }).Replace("blabla", "");

내가 원하는 경로의 기본 URL을 제공했습니다.

/Cont/Act/

도움이 되었기를 바랍니다.


대안 솔루션은 솔루션 구성을 사용하는 것입니다.

protected override OnActionExecuting()
{
    #if DEBUG

        // set up stuff in the ViewData

    #endif

    // continue
}

이와 같이 경로 이름을 참조할 필요가 없어야 합니다. 이것이 MVC가 이런 종류의 작업을 수행하는 것을 어렵게 만드는 이유입니다.


다른 옵션 - string[] namespaces 인수와 함께 MapRoute를 사용하면 네임스페이스를 다음과 같이 볼 수 있습니다. RouteData.DataTokens["Namespaces"]

ReferenceURL : https://stackoverflow.com/questions/363211/how-can-i-get-the-route-name-in-controller-in-asp-net-mvc

반응형