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
、リクエストを行うときにメソッドが呼び出されることはありません。ここで明らかな何かが欠けていますか?ルートデバッグツールを使用しようとしましたが、すべてが良さそうなので、ここで途方に暮れています!