13

過去 1 か月ほど、大規模な MVC アプリケーションに取り組んできましたが、カスタム ルート ハンドラーを定義する必要が生じたのはこれが初めてで、いくつかの問題に直面しています。基本的に、渡すパラメーターが 2 つあります。1 つ目は必須で、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/Test2param1 = "Test1" および param2 = "Test2" で期待どおりに動作します。

URL を試してみると、http://[myserver]/MyController/MyAction/Test1両方のパラメーターが null です。

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

4

3 に答える 3

13

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

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このルートと一致するようになります。

于 2012-10-05T05:45:02.633 に答える
1

これを試して

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

「 UrlParameter.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()
 }
于 2012-10-05T06:09:46.257 に答える
1

こんにちは、あなたはこのように敗走を作成します。これはあなたを助けると思います

routes.MapRoute(
                "Regis", // Route nameRegister
                "Artical/{id}", // URL with parameters
                new { controller = "Artical", action = "Show", id = UrlParameter.Optional } // Parameter defaults
            );
于 2012-10-05T05:31:57.450 に答える