2011-12-04 19 views
0

Imは私のアプリケーションの代替ルートを設定しようとしている...私はアクションを持ってルーティングが機能しないのはなぜですか?

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

...

public ActionResult GetBlogsByMonth(string datetime) 
     { 
      if (datetime!= null) 
      { 
       IList<BlogModel> blogs = (IList<BlogModel>)manager.GetBlogsInMonth(DateTime.Parse(datetime)).ToList(); 
       return View(blogs); 
      } 
      else 
      { 
       return View(); 
      } 
     } 

しかし、私はアクションにデバッガを入れたときに日時が常にありますヌル... :-(

+4

への不要な呼び出しを避けることができるようにするには、代わりに、String型のパラメータとして、あなたのアクションでのDateTime型を使用することができますどのようなURLのように見えるのですか? –

+0

'{controller}/{action}/{year}/{month}'と 'GetBlogsByMonth(string year、string month)'のようなルートを定義する方が簡単ではないでしょうか? .. –

答えて

1

おそらく、あなたの要求は、別の経路によってキャッチされています。あなたがそれらを登録する際に一番上にルートを入れていることを確認してください。

あなたが要求をキャッチしますデフォルト1、デフォルトのもので、このルートを使用している場合たとえば、いないカスタムルートは、次の順序でそれらを参照する場合:@として、溶液は、溶媒として

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


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

ダーリンは、あなたが前にカスタムを置くと、今度はデフォルトのものが決して打撃を受けないので、あなたは制約を定義する必要があると示唆しました。

routes.MapRoute(
    "x", // Route name 
    "{controller}/{action}/{datetime}", // URL with parameters 
    new { controller = "Home", action = "Index", datetime = UrlParameter.Optional }, // Parameter defaults 
    new { datetime = @"^(19|20)\d\d([- /.])(0[1-9]|1[012])\2(0[1-9]|[12][0-9]|3[01])$" } 
); 

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

以下のURLは、カスタムルートによってキャッチされます。

/プー/バー/ 2011年11月31日

/プー/バー/ 2011-01-04

/Poo/Bar/2011-01-04

必要に応じてRegExを変更することができます。

+1

2つの経路が実際にまったく同じパターンを表しているため、順序を逆にすると、デフォルト経路は決してヒットしません。曖昧さを解消したい場合は、経路制約を定義する必要があります。 –

+0

@DarinDimitrovあなたは正しいです。しかしどちらの場合も、カスタムのものはデフォルトのものの前に参照する必要があります。 – tugberk

+0

はいこれは本当です。私はあなたが質問に答える例を提供できるかどうか疑問に思っていただけです。 –

0

アクションへのリンクを作成するときは、ActionLinkの代わりにRouteLinkを使用できます。 RouteLinkを使用すると、名前付きルート名を渡して強制的に正しいルートを選択し、リンクを構築することができます。あなたの例のリンクは次のように何とかなります。

@Html.RouteLink("Blog Posts...", "x", new { controller="Blog", action="GetBlogsByMonth" datetime = THEDATETIME }) 

ヒント:あなたはDateTime.Parse

関連する問題