2012-11-30 6 views
7

私は最新のasp.net mvc 4アーキテクチャを使っていくつかのルーティング制約を働かせようとしています。 App_Startには、RouteConfig.csというファイルがあります。ASP.net MVC 4 RouteConfig.csで制約を使用するにはどうすればよいですか?

下の例の制約セクションを削除した場合、URLは機能します。しかし、私はいくつかの制約を加えて、URLがすべてのものと一致しないようにする必要があります。

動作するはずです:/動画/評価/ 1

動作しませSHOLD:/動画/ 2458 /テキスト・ゴーズ・ここでこれは私が持っているものである

//URL: /videos/rating/1 
routes.MapRoute(
    name: "Videos", 
    url: "videos/{Sort}/{Page}", 
    defaults: new { controller = "VideoList", action = "Index", Sort = UrlParameter.Optional, Page = UrlParameter.Optional }, 
    constraints: new { Sort = @"[a-zA-Z]", Page = @"\d+"} 
); 

答えて

11

あなたの場合同じルート上に複数のオプションパラメータが必要な場合は、2つ目のURLを使用するためにURLに最初のURLを指定する必要があるため、問題が発生します。制約を使用してもパラメータの評価が中止されるわけではなく、代わりにこのルートに一致しません。

は、例えばこれを持っ:/videos/3

これが一致しようとしているときは、動画を見つけ、「OK、私はまだ一致する」と言います。次に、Sortである次のパラメータを調べ、値3を取得してから制約に対してチェックします。制約は失敗するので、「OPPS、私はこのルートに一致しません」と言い、次のルートに移動します。 sortパラメータを定義しないでページを指定するには、代わりに2つのルートを定義する必要があります。

//URL: /videos/rating/1 
routes.MapRoute(
    name: "Videos", 
    url: "videos/{Sort}/{Page}", 
    defaults: new { controller = "VideoList", action = "Index", Page = UrlParameter.Optional }, 
    constraints: new { Sort = @"[a-zA-Z]+", Page = @"\d+"} 
); 

//URL: /videos/1 
routes.MapRoute(
    name: "Videos", 
    url: "videos/{Page}", 
    defaults: new { controller = "VideoList", action = "Index", Sort = "the actual default sort value", Page = UrlParameter.Optional }, 
    constraints: new { Page = @"\d+"} 
); 

私は、可能な場合は最初の最も特定のルートを入れて、少なくとも特定で終わるが、この場合には順序があるため、制約の問題ではないはずです。具体的な意味はほとんど定義された値なので、の最初のルートでソートを定義する必要があります。ページも指定できるので、ページパラメータだけのルートよりも具体的です。

+0

ありがとう、それはカップルの問題を解決するのに役立ちました。 – Maddhacker24

1

多分かなり遅く私の入力が、他の人はまだ物事をシンプルに保つanswers.Toを検索するために、私は実装の選択に応じ

routes.MapRoute(
    name: "Videos", 
    url: "{controller}/{action}/{id}", 
    defaults: new { controller = "VideoList", action = "Index", id="" }, 
    constraints: new { id = @"\d+"} 
    ); 

ファイル私RoutesConfigに次のように使用することになり、IDは以下のようになりUriParameter .Optionalですが、実行時に文字列/ intを渡すので、このシナリオではid = ""になります。

このスタイルは、常にコントローラ例えばVideoListControllerクラスで終わる大会コントローラクラスによって心に留めておくべきhttp://www.asp.net/mvc/overview/older-versions-1/controllers-and-routing/creating-a-route-constraint-cs

一つのことから採用されました。このクラスは、以下の方法

public ActionResult Index(string id) 
{ 
    // note this maps to the action 
    // random implementation 
    ViewBag.Message=id; 
    View() 
} 

//を含むコントローラフォルダの下に表示される必要があり、このアプローチは、まだ整数のみを一致させるには... を任意の文字列に一致する注意し、Indexメソッドは

public ActionResult Index(int id) 
{ 
    // note this maps to the action 
    ViewBag.Message=id; 
    View() 
} 
を書き直す必要があります

したがって、このアプローチはVideoList/Index/12 で動作しますが、VideoList/Index/somerandomtextを置くと、実行時にエラーがスローされます。これは、エラーページを使用することで解決できます。 私はこれが役立つことを願っています。非常に便利な場合は投票してください。

関連する問題