今日私はこれと非常によく似た問題を解決しなければなりませんでした。解決策を探していたとき、私はあなたの質問を見つけました。私は今、あなたのプロジェクトには関係がないかもしれませんが、それに遭遇した他の人にとって役に立つかもしれない解決策を見つけました。
Route
クラスのカスタム実装をvanilla MVC Routeクラスではなくルートコレクションに追加することで、この問題を解決できます。したがって、次のようなものがあります。
public class ClientNameRoute : Route
{
public ClientNameRoute(string url, IRouteHandler routeHandler) : base (url, routeHandler) {}
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
values["clientName"] = Identity.ClientName;
return base.GetVirtualPath(requestContext, values);
}
}
これらのルートを簡単に登録できるように、いくつかの拡張メソッドを作成します。例:
public static RegionRoute MapClientNameRoute(this AreaRegistrationContext context, string name, string url, object defaults)
{
if (context.Routes == null)
throw new ArgumentNullException("context.Routes");
if (url == null)
throw new ArgumentNullException("url");
if (context.Namespaces != null)
context.Namespaces.ToArray();
var route = new ClientNameRoute(url, new MvcRouteHandler())
{
Defaults = new RouteValueDictionary(defaults),
DataTokens = new RouteValueDictionary(),
};
route.DataTokens["area"] = context.AreaName;
var useNamespaceFallback = context.Namespaces == null || context.Namespaces.Count == 0;
route.DataTokens["UseNamespaceFallback"] = useNamespaceFallback;
if (!useNamespaceFallback)
route.DataTokens["Namespaces"] = context.Namespaces.ToArray();
context.Routes.Add(name, route);
return route;
}
public static RegionRoute MapClientNameRoute(this RouteCollection routes, string name, string url, object defaults, string[] namespaces)
{
if (routes == null)
throw new ArgumentNullException("routes");
if (url == null)
throw new ArgumentNullException("url");
var route = new ClientNameRoute(url, new MvcRouteHandler())
{
Defaults = new RouteValueDictionary(defaults),
DataTokens = new RouteValueDictionary()
};
if (namespaces != null && namespaces.Length > 0)
{
route.DataTokens["Namespaces"] = namespaces;
}
routes.Add(name, route);
return route;
}