2017-12-22 4 views
0

スコープをフィルタリングするためのいくつかのパラメータを受け取るコントローラアクションを作成しようとしていますが、最後のパラメータは結果をページングするのに必要なページングパラメータです。MVC4ルートのオプションの中間パラメータ

//Example Action 
public ActionResult Details(string time, string regionscope, string localscope = null, int page = 1) { 

} 

//RouteConfig.cs 
routes.MapRoute(
    name: "LocationWithLocalScopeRoute", 
    url: "/Details/{time}/{regionscope}/{localscope}/{page}", 
    defaults: new 
    { 
     controller = "Location", 
     action = "Details", 
     localscope = UrlParameter.Optional 
    } 
); 

とにかく私はlocalscopeパラメータを除外したが、まだ(まだかなりのURLを維持しながら)pageパラメータがコントローラによって、ページ番号として解釈することができありますか?

// Test URLs 
/Details/May-17/Mid/1 
/Details/May-17/Mid/Bumville/1 

私は既存のルートの前にルートを追加することができます知っている:

//RouteConfig.cs 
routes.MapRoute(
    name: "LocationWithNoLocalScopeRoute", 
    url: "/Details/{time}/{regionscope}/{page}", 
    defaults: new 
    { 
     controller = "Location", 
     action = "Details" 
    } 
); 

私も、私は他のパラメータのいずれかの前にpageを置くことができます実現します。

routes.MapRoute(
    name: "LocationWithLocalScopeRoute", 
    url: "/Details/{page}/{time}/{regionscope}/{localscope}", 
    defaults: new 
    { 
     controller = "Location", 
     action = "Details", 
     localscope = UrlParameter.Optional 
    } 
); 

テストURLが動作している間に、1つのルート定義ですべてを動作させる方法があるかどうか疑問に思っていました。

+0

短い回答は(複数のルートを作成しない限り)いいえです。最後のパラメータだけがオプションになります。 –

+0

@StephenMuecke私が追加した代替オプションのうち、お勧めしますか?あるいは、別の方法があれば、私はそれを読むことができます。 – SomeShinyObject

+1

個人的には、第1のオプションを使うつもりです。なぜなら、ページ番号を最後に持つURLとして、より意味をなさないと思うからです。 –

答えて

1

いいえ、別の特定のルートを作成したり、最後のパラメータをlocalscopeにすることはできません。

ルーティングを使用する場合、最後のパラメータだけをUrlParameter.Optionalとマークできます。それ以上のものがオプションである場合、ルーティングエンジンはどのルートセグメントがどのメソッドパラメータに適用されるかを知る方法がありません。あなたのケースでは

URLは../Details/May-17/Mid/1で、1localscopeの値またはpageの値の値を持つ最後のセグメントのですか?これを判断する方法はないので、@Url.Action()(またはURLを生成する他の方法の1つ)を使用してURLを生成する場合、urlはルート値ではなくクエリ文字列値で生成されます。

関連する問題