web-dev-qa-db-ja.com

1つの必須パラメーターと1つのオプションパラメーターを使用したASP.NETMVCルーティング?

私はこの1か月ほどで大規模なMVCアプリケーションに取り組んできましたが、カスタムルートハンドラーを定義する必要があったのはこれが初めてであり、いくつかの問題が発生しています。基本的に、渡すパラメータは2つあります。最初のものは必須で、2番目のものはオプションです。

私はこの答えに従っています ここ

これが私のカスタムルートです:

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です。

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

13
jebar8

あなたが新しいルートを作成し、あなたのルートと非常によく似たデフォルトのルートを残したと思います。最初に一致するルートを見つけるために、ルートのコレクションがトラバースされることに注意してください。したがって、デフォルトのものを残した場合:

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を呼び出し、「Text1」をidという名前のパラメータに設定します。このアクションはidという名前のアクションを宣言していないため、これは失敗します。

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

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

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

13
Rafal

これを試して

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

"rlParameter.Optional"を使用して1つのパラメーターをオプションとして指定でき、DataTypeで2番目のパラメーターを指定すると、整数値を渡すとDataType(@ "\ 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()
 }
1
Shivkumar

こんにちはあなたはこのようなあなたのルートを作成します私はこれがあなたを助けると思います

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