13

私は過去1ヶ月間に亘って大規模なMVCアプリケーションを開発してきましたが、カスタムルートハンドラを定義する必要があるのは初めてですが、いくつかの問題が発生しています。基本的に私は2つのパラメータを渡します。最初のものは必須で、もう1つはオプションです。1つの必須パラメータと1つのオプションパラメータを使用したASP.NET MVCルーティング?

私はこの回答に続きますhereです。ここで

は私のカスタムルートです:

routes.MapRoute(
    "MyRoute", 
    "{controller}/{action}/{param1}/{param2}", 
    new { 
     controller = "MyController", 
     action = "MyAction", 
     param1 = "", 
     param2 = "" // I have also tried "UrlParameter.Optional" here. 
    } 
); 

そして、私のアクションメソッドのシグネチャ:

public ActionResult MyAction(string param1, string param2) 

私はURL http://[myserver]/MyController/MyAction/Test1/Test2をしようとした場合、私はそれが期待するように、それはのparam1 =「Test1をして、動作します"とparam2 =" Test2 "

URL http://[myserver]/MyController/MyAction/Test1を試すと、両方のパラメータがnullになります。

私が迷っているので、誰かが私がここで間違っていることを教えてくれることを願っています。

+0

こんにちは - 今ルーティング属性を試す - WAY WAYより簡単に、エラーが発生しにくい。 – niico

答えて

13

私はあなたが新しいルートを作成し、あなたに非常によく似ているデフォルトの1を残していることを前提としHEPすると思います。このようなあなたの敗走を作成します。最初に一致するルートを見つけるために、ルートの収集が横断されていることに注意してください。あなたはデフォルトのままにしているのであれば:あなたのルート上の

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

を、それはhttp://[myserver]/My/MyAction/Test1に要求に一致してMyController.MyActionを呼び出し、idという名前のパラメータを「テキスト1」を設定します。このアクションは、idという名前を宣言していないために失敗します。

何をする必要がルートリスト内の最初としてあなたのルートを移動し、それが今であることがより具体的にすることです:

routes.MapRoute(
      "Route", 
      "My/{action}/{param1}/{param2}", 
      new 
      { 
       controller = "My", 
       action = "MyAction", 
       param1 = "", 
       param2 = "" 
      }); 

これは、すべてのトラフィックを強制しますが、このルートに一致するようにトラフMyをルーティングされました。

+1

私は何をしても、このようなパスで複数のパラメータを処理することはできません。 2つのパラメータを作成し、 'My/MyAction/param1/param2'のようなURLを持つページをリクエストしようとすると、404エラーが発生します。私は間違って何をしていますか? – DavidHyogo

1

がhi私はこれがあなたに

routes.MapRoute(
       "Regis", // Route nameRegister 
       "Artical/{id}", // URL with parameters 
       new { controller = "Artical", action = "Show", id = UrlParameter.Optional } // Parameter defaults 
      ); 
0

あなたは「UrlParameter.Optional」を使用して、オプションとして一つのパラメータを指定するとデータ型を有する第二1を指定することができます

routes.MapRoute("MyRoute", 
       "myRoute/{param1 }/{param2 }", 
       new { controller = "MyController", action = "MyAction", param2 = UrlParameter.Optional }, 
       new { param2 = @"\w+" }); 

これはあなたがしてデータ型(@「\ D +」)の整数値を渡す場合を意味してください文字列の場合は上記のとおりです。

注:パラメータの順序は非常に重要なオプションのパラメータであり、最後ので通過し、Gloab.asaxでデフォルトルートの前に、あなたの新しいルートを登録する必要があります。未来からあなたに

<a href="@Url.RouteUrl("MyRoute", new { param2 = "Test1",param1 = "Test2"})">Test</a> 

または1つのパラメータを持つ

<a href="@Url.RouteUrl("MyRoute", new { param2 = "Test1"})">Test</a> 

よう

、あなたのアクションリンクコントローラ

public ActionResult MyAction(string param2,string param1) 
{ 
    return View() 
} 
関連する問題