7

最新のasp.net mvc 4アーキテクチャを使用して、いくつかのルーティング制約を機能させようとしています。App_Start の下に RouteConfig.cs というファイルがあります。

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

動作するはずです: /videos/rating/1

動作しないはず: /videos/2458/Text-Goes-Here

これは私が持っているものです:

//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+"}
);
4

2 に答える 2

12

同じルートに複数のオプション パラメータが必要な場合は、2 番目のパラメータを使用するために 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+"}
);

可能であれば最も具体的なルートを最初に配置し、最も具体的でないルートで終了しますが、この場合、制約のために順序は重要ではありません。具体的とは、最も定義された値を意味するため、この場合、最初のルートで並べ替えを定義する必要があり、ページも指定できるため、ページ パラメーターのみのルートよりも具体的です。

于 2012-11-30T19:05:16.880 に答える
1

私の入力はかなり遅いかもしれませんが、他の人はまだ答えを探しています.物事を簡単にするために、RoutesConfigファイルで次を使用します

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

実装の選択に応じて、id は UriParameter.Optional になる可能性がありますが、このシナリオでは、実行時に string/int を渡すため、id="" になります。

このスタイルはhttp://www.asp.net/mvc/overview/older-versions-1/controllers-and-routing/creating-a-route-constraint-csから採用されました

慣例で覚えておくべきことの 1 つは、コントローラー クラスは常にコントローラーで終わります (例: VideoListController クラス)。このクラスは、次のメソッドを含むコントローラー フォルダーの下にリストする必要があります。

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 を配置すると、実行時にエラーがスローされます。これは、エラー ページを使用することで解決できます。これが役立つことを願っています。非常に役立つ場合は投票してください。

于 2015-12-09T22:06:53.663 に答える