2011-01-31 10 views
3

私たちのサイトには、人々がサインアップして〜/ pageSlugにホストしたいサイトに自分のページを与えることができます。私はGlobal.asaxでルールを実行しようとしましたが、〜/ コントローラがインデックスアクションに直接マップすることができる基本的なデフォルトルートが破られました。私はuserSlugの前にセパレータを置くことは許されていないので、〜/ p/pageSlugは実際にはオプションではありません。ASP.NET MVC RouteTableに動的に追加するにはどうすればよいですか?

ルートにユーザーページを追加するという点で、私はApp_Startのページをサイクリングして明示的にRoutesTableに追加しています。これは正常に動作しており、AppPoolのリフレッシュでこれを1日1回の作業に充分長く設定しています。これは私たちが解決しようとしている私たちのユーザーのために "ページを生き生きさせる"ための24時間の転換を私たちに残す。

理想的には、ユーザーがサインアップすると、関連するルートをルートテーブルに動的に追加することです。私はそれをやってみた:

RouteTable.Routes.Add(
    RouteTable.Routes.MapRoute(
     toAdd.UrlSlug + "Homepage", 
     toAdd.UrlSlug, 
     new { controller = "Controller", View = "View", urlSlug = toAdd.UrlSlug } 
    ) 
); 

しかし、それは動作していないようだ。私は他の場所で解決策を見つけることができません。私のコードは恐ろしく素朴で、ルーティングの理解が不足していることを裏切っています。

+0

私はこの1つを解決しますが、すぐに手にコードしない、とすると、自分の質問に答えるのエチケットのわからなかったしました!誰かが後者についてアドバイスできれば、私はそれをどのように修正したかを人々に知らせてくれるでしょう:) – jonsidnell

+2

あなた自身の質問に答え、それを正しいものとしてマークすることは有効です。古い質問ですが、可能であればあなたのソリューションを投稿することはできますか?完全性の両方の、と私は正確に同じ問題を抱えているという事実:) – Will

答えて

0

私はあなたが経路を動的に追加できるとは思わない。

はこの質問を見てみましょう、多分それはあなたを助ける: ASP.NET MVC custom routing for search

+0

うーん、私は、これは本当かもしれないと思うし始めている - コードのデバッグ、RouteTable.Routes.Add()が正常の数を増やすように見えます明らかにその要求サイクルのためにだけである。それは、アプリケーション全体で使用されているRouteTableにそれを維持するようには思われません。 – jonsidnell

+0

@jsidnell - エリアのダイナミックな作成(新しいルートに至るまで)を求める人々を覚えており、その答えは「サポートされていません」でした。私のマルチテナントアプリケーションでは、スラッグとカスタムmvcハンドラを使ってジェネリックルートを作成して、スラグの価値を手に入れました。 –

2

何がルート制約を使用して、これをしようとした場合。すべてのユーザーのリストを取得し、Global.asax.csに

public class UserPageConstraint : IRouteConstraint 
{ 
    public static IList<string> UserPageNames = (Container.ResolveShared<IUserService>()).GetUserPageNames(); 

    bool _IsUserPage; 
    public UserPageConstraint(bool IsUserPage) 
    { 
     _IsUserPage = IsUserPage;    
    } 

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     if (_IsUserPage) 
      return UserPageNames.Contains(values[parameterName].ToString().ToLower()); 
     else 
      return !UserPageNames.Contains(values[parameterName].ToString().ToLower()); 
    } 
} 

次にそのリスト内のエントリに一致するように選択されたルートを拘束、ユーザーのためにルートを設定し、次のように:

routes.MapRoute("UserHome", "{userPage}", new { controller = "UserPageController", action = "Index" }, new { userPage = new UserPageConstraint(true) }); 

のためにこれはUserPageControllerの 'index'のアクションの中で、上記のルートを使って、userPageをパラメータとして持つことになります。

userPageホームに関連する他のルートについては、それに応じてルートを追加できます。たとえば、userdetailsページのルートを次のように追加できます。

routes.MapRoute("UserHome", "{userPage}/mydetails", new { controller = "UserPageController", action = "Details" }, new { userPage = new UserPageConstraint(true) }); 

これを試してみることができます。

+0

非常に便利です。 CMSのユースケースのためにdbからロードされたコンテンツを持つ動的な "Page"コントローラを欲しかったのと同じようなシナリオでこれを動作させるように管理しました。 – Dan

1

Route Magic のような外部ライブラリを使用せずに、経路を動的に追加するのではなく、私は最近それを実現しました。私はあなたのアーキテクチャーを正しく設計すれば、ルーティング制約が必要なだけかもしれないと確信しています。私のアプリケーションは小さいので、実装されたコントローラーを1つしか使用せず、残りのものを動的に作成しています(現時点では実験的ですが、うまくいくはずです)。

以下の点を考慮したルート

routes.MapRoute(
    name: "ContactRequests_Operations", 
    url: "ContactRequests-{operation}", 
    defaults: new { controller = "Content", action = "Module_Direct", id = "ContactRequests" , operation = "Get" } 
); 

routes.MapRoute(
    name: "Messages", 
    url: "Messages", 
    defaults: new { controller = "Content", action = "Direct", id ="Messages" } 
); 
関連する問題