2012-01-31 5 views
0

私は現在、アプリケーションにニュース記事の側面を書いています。新しい記事(新しい記事用)をRouteTableに追加しました。ルートテーブルには問題はありませんが、ルートは到達できません。次のようにRouteTableに動的に追加していません

私が使用しているコードは次のとおりです。

var routes = RouteTable.Routes; 
using (routes.GetWriteLock()) 
{ 
    var url = contentHelper.GetPageUrl(page); 
    routes.MapRoute(page.Id.ToString(), url, new { controller = "Cms", action = "Index", id = url }, new[] { "Web.Controllers.CmsController" }); 
} 

新しいURL、私が以前に言ったように、RouteTable.Routesに追加されますが、私はページを取得傾けます。再起動後、Global.asax内のRegisterRoutesによって取得され、うまく動作します。

私はアプリを強制することなく、これを達成したいとあなたがこの上で当てることができ、任意の光は、素晴らしいことだ

EDITを再起動しますこれは私のGlobal.asax

からRegisterRoutesです
public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute("LogOff", "LogOff", new { controller = "Account", action = "LogOff" }); 

     routes.MapRoute(
       "News", // Route name 
       "News/",// URL with parameters 
       new { controller = "NewsPage", action = "Index" }, // Parameter defaults 
       new[] { "Web.Controllers.NewsController" } 
      ); 

     //register all content pages 
     var urls = new ContentPageHelper().GetAllUrls(); 
     foreach (var url in urls) 
     { 
      routes.MapRoute(url.Key.ToString(), url.Value, new { controller = "Cms", action = "Index", id = url.Key }, new[] { "Web.Controllers.CmsController" }); 
     } 

     routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}",// URL with parameters 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
     ); 
    } 

答えて

4

と同様です。既定のルートは通常、テーブルに最後に追加されるルートですが、ルートテーブルを作成した後でRouteTable.MapRouteを動的に呼び出しているため、既定のルートが新しく追加されたルートに到達する前にヒットしています。

この問題に対する私の解決策は次のとおりです。

public static void AddContentRoute(this RouteCollection routes, Data.UrlMap map, bool needsLock = false) 
    { 
     var route = new Route(map.Url, new MvcRouteHandler()); 
     route.Defaults = new RouteValueDictionary(new 
     { 
      controller = "Content", 
      action = "Display", 
      id = map.Id, 
      type = map.Type 
     }); 

     if (needsLock) 
     { 
      using (routes.GetWriteLock()) 
      { 
       routes.Insert(0, route); 
      } 
     } 
     else 
     { 
      routes.Insert(0, route); 
     } 
    } 

これは本質的にRouteTable.MapRouteが何を行いますが、代わりに最後のテーブルの上にルートを挿入します。

テーブルの上部に座る必要のあるルートが他にある場合は、このソリューションを変更することができます。

+0

ルートを追加するにはロックを必要とするかどうかを(パラメータとして渡すと)どのように決定するのですか? – Rodolfo

+0

私が書いた関数は、基本的にRouteTable.MapRouteが何をするかのコピーです(ソースを確認し、自分で参照してください)。スレッドされた状況ではロックを使用してください。ほとんどの場合、ロックは必要ありません。 – Brendan

-1

なぜあなたはその場でルートを作成しますか?アプリケーションが自分自身でアプリを再起動するときに目的を破ることはないでしょうか?すべてのルートを再作成して動作させる必要があります

あなたのCMSへのすべてのリクエスト?

routes.MapRoute("CmsPage", "{page}", new { controller = "Cms", action = "Index"}, new [] { "Web.Controllers.CmsController" }); 

アプリケーション内の他のルート/コントローラと衝突しないようにする場合は、常に生成されたすべてのページにページを付けることができます。私は今作成しているCMSサイトでこれをやっています。お使いのコントローラで

routes.MapRoute("CmsPage", "pages/{page}", new { controller = "Cms", action = "Index"}, new [] { "Web.Controllers.CmsController" }); 

あなたの行動は問題がRouteTable.MapRouteを呼び出すと、テーブルの最後にルートを追加することで、この

public ActionResult Index(string page) 
{ 
    // logic to load page 
    return View(); 
} 
+0

私はすでにglobal.asaxでこれをやっていますが、アプリケーションを再起動しなくても、新しいページを作成するとすぐに、 – JamesStuddart

+0

という経路がglobal.asaxで作成されていればすぐに利用できるはずです彼らは作成されています。あなたのアクションが呼び出されたとき、あなたのページをどのように取得していますか?あなたはデータベースにページを保存しますか? –

+0

また、 'Pages /'をURLに追加するのは、醜くてハッキリなやり方で、SEOの観点からは何もできません。 global.asaxの編集を参照 – JamesStuddart