2

CustomRoute次の構造で、メソッドに対してさまざまなことを実行するというカスタムルートを作成しましたGetVirtualPath(この例では、URL全体を小文字に設定しています)。

public sealed class CustomRoute : Route
{
    public CustomRoute(string url, IRouteHandler routeHandler) : base(url, routeHandler) { }
    public CustomRoute(string url, RouteValueDictionary defaults, IRouteHandler routeHandler) : base(url, defaults, routeHandler) { }
    public CustomRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints, IRouteHandler routeHandler) : base(url, defaults, constraints, routeHandler) { }
    public CustomRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints, RouteValueDictionary dataTokens, IRouteHandler routeHandler) : base(url, defaults, constraints, dataTokens, routeHandler) { }

    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
    {
        VirtualPathData path = base.GetVirtualPath(requestContext, values);

        if (path != null)
        {
            path.VirtualPath = path.VirtualPath.ToLowerInvariant();
        }

        return path;
    }
}

このルートを、次の拡張メソッドを使用してルートコレクションに追加していますMapCustomRoute

public static CustomRoute MapCustomRoute(this RouteCollection routes, string url, object defaults)
{
    CustomRoute route = new CustomRoute(url, new RouteValueDictionary(defaults), new MvcRouteHandler());

    routes.Add(route);

    return route;
}

そして最後にRouteTable.Routes、global.asaxのコレクションでこの拡張機能を呼び出します。

RouteTable.Routes.Clear();
RouteTable.Routes.MapCustomRoute("somecontroller/someaction/{id}", new { controller = "Home", action = "Index" });

ルーティングは正常に機能し、リクエストは対応するコントローラーとアクションに正しくマップされますが、URLはまだ大文字です。コードをステップスルーするCustomRouteと、ルートを初期化するときにコンストラクターが呼び出されていることがわかりますがGetVirtualPath、リクエストを行うときにメソッドが呼び出されることはありません。ここで明らかな何かが欠けていますか?ルートデバッグツールを使用しようとしましたが、すべてが良さそうなので、ここで途方に暮れています!

4

1 に答える 1

2

質問リストを調べて、開いている質問を閉じると、これが見つかります。これは奇妙なものでした。これを修正するには、Visual Studio ソリューションを最初から再作成する必要がありました。次に、上記の正確なコードを使用すると、新しいプロジェクトは正しく機能しましたが、古いプロジェクトは機能しませんでした。私はそれがVS 2010の奇妙さだと思います.両方のソリューションを並行して実行し、それらがまったく同じコードベースを持ち、1つは機能し、もう1つは機能しないことを確認しました.

于 2013-02-19T15:56:26.417 に答える