4

ASP.NET MVC3 アプリケーションのルーティングに問題があり、思いどおりに動作しません。

Global.asax のルーティング定義

routes.MapRoute(
            "News", // Route name
            "{lang}/{controller}/{action}/{page}/{id}", // URL with parameters
            new { lang = "pl", controller = "News", action = "Index", page = 1, id = UrlParameter.Optional } // Parameter defaults
        );

だから私は2つの状況でそれを使いたい:

  1. /{lang}/{controller}/{action}/{page}- 特定のページネーションのページに移動する
  2. /{lang}/{controller}/{action}/{page}/{id}- 現在のページを記憶し、特定のid.

私が使用するリンクを生成するには:

@Html.RouteLink(i.ToString(), "News", new { lang = ViewBag.Lang, page = i })

iページ番号、lang は言語です。

コントローラーでは、魔女のアクションを処理します:

public ViewResult Index(string lang, int page = 1)

問題

@Html.RouteLinkリンク/pl/News/Index/2が表示されますが (「2」がクリックされた場合)、コントローラーはそれを処理せず、ページは「1」のままです。したがって、同じリンクを 2 回クリックすると、次のよう/pl/News/Index/2/2になります。ページは「2」に等しくなります。

誰かがそれがどのように正確に機能するかを説明してくれたら、それを解決するために何ができますか?

どんな助けでも大歓迎です。

4

2 に答える 2

2

ここで見逃しているのは、ルーティング システムが現在のリクエストの変数値を使用してアウトバウンド ルールを生成していることです。

たとえば、ページ /pl/News/Index/2 にいる場合、

lang = "pl", controller = "News", action = "Index", page = 2

このようなルールを生成しようとすると

@Html.RouteLink(i.ToString(), "News")

ルーティング システムは、 langpageなどの既存の変数を使用し、まったく同じ URL (/pl/News/Index/2) を生成します。

もちろん、Html.RouteLink の匿名型で渡す値は優先的に処理され、現在の要求の値をオーバーライドします。したがって、あなたの例では、リンクを生成するときに現在の URLを考慮する必要があります。

優先順位は次のとおりです。

  1. 匿名型で渡される変数
  2. リクエスト変数
  3. ルートで定義されたデフォルト値。

どうやらこの部分は

lang = ViewBag.Lang

langを指定しないと、リクエストからlangが取得されるため、役に立たないため、保存されます。

更新(関係ないかもしれません):

また、ルールに複数の一致がある場合、ルーティング システムは制約を満たす最初のルールを選択することにも注意してください(たとえば、リクエストからの値はデフォルト変数と競合してはなりません)。

Update2 :

ルーティング システムは、(匿名型を介して) 最初に明示的に指定された変数までリクエスト変数を使用するため、langを明示的に指定すると、リクエスト変数は再利用されません (あなたの場合、langは URL の最初のセグメントであるため)。

于 2012-06-13T07:39:39.433 に答える
0

あなたの問題の一部は、規則を少し破っていることだと思います.MVCは規則に依存して正常にルーティングするため、マッピングが少し壊れています。

ルーティングを次のように書き直すことをお勧めします。

routes.MapRoute(
            "News", // Route name
            "{controller}/{action}/{lang}/{id}/{page}", // URL with parameters
            new { controller = "News", action = "Index", lang = "pl", page = 1, id = UrlParameter.Optional } // Parameter defaults
        );

URL の最も一般的なシナリオは次のようになります。

http://yourdomainhere/news/pl/some-sort-of-permalink/1
于 2012-06-13T07:42:14.287 に答える