2010-12-02 7 views
2

私たちは、URLが、このようなコードを使用して書かれ、すでに書かれたコードのトン持っている:私たちのアプリケーションは、そのデータベースへの当社のユーザーのログインマルチテナント型アプリケーションであるASP.NET MVC2のUrl.Action()のRouteValuesに暗黙の値またはセッション値を自動的に追加できますか?

Url.Action("Index", "MyController", new {page=1}) 

を。つまり、ログインプロセスでは、セッションで使用するデータベースを選択できます。データベースの名前がURLの一部であるように、これを最初に構築しませんでした。それはちょうどセッションの一部として保持されました。

ここで、すべてのURLにデータベース名を入れて、ブラウザURLでブックマークを作成し、ログイン時に正しい一致するデータベースを選択することなくその特定のページに正しくアクセスできるようにします。どこにでも移動することなく

Url.Action("Index", "MyController", new {page=1, clientName=Identity.ClientName}) 

とmannuallyそれを行う:ASP.NET MVCで上記の呼び出しを作るための方法があった場合は基本的に、それはいいだろう。このような何かを行います。我々はこれを行うために数千の場所を話している..

これは実行可能ですか?

答えて

0

私はこれを今すぐ行うことができないと仮定し、Url.Action、Html.ActionLink、およびController.Redirectの独自の実装を記述し、グローバル検索を行い、バージョン。残念な。

0

今日私はこれと非常によく似た問題を解決しなければなりませんでした。解決策を探していたとき、私はあなたの質問を見つけました。私は今、あなたのプロジェクトには関係がないかもしれませんが、それに遭遇した他の人にとって役に立つかもしれない解決策を見つけました。

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; 
} 
関連する問題