web-dev-qa-db-ja.com

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でそれにアクセスしたいので、たとえば、/ debug/...をURLの前に付けることで、デバッグ時にViewDataにスタッフを設定できます。

53
Mike Scott

残念ながらルート名はルートに保存されません。コレクションのキーとして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"]

お役に立てば幸いです。

74

追加パラメーターのデフォルト値を使用して、ルート値を介してルート名を渡すことができます。

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();
1
Alexander

代替ソリューションは、ソリューション構成を使用することです。

protected override OnActionExecuting()
{
    #if DEBUG

        // set up stuff in the ViewData

    #endif

    // continue
}

このようなルート名を参照する必要は実際にはないはずです。これが、MVCがこの種のことを実行することを非常に困難にしている理由だと思います。

0
ajbeaven

これは直接質問に答えません(知識を深めたい場合)。ただし、実際の目的は、ルート名を指定して、ルートのベース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/

お役に立てれば。

0
logicalguy