2

手に負えなくなってきているリクエストコントローラーがあり、クリーンな URL を維持しながら、複数のコントローラーでアクションを分割したいと考えています。ルーティングを試してみましたが、成功しませんでした。ルーティングに関するいくつかの例とチュートリアルを読みましたが、例は理解していますが、私のケースには何も当てはまらないようで、賢明ではないと感じています。私が望むのは、URLRequests/Approvalが RequestController ではなく ApprovalController で処理されるようにすることです。そのため、次のように記述しました。

public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

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

        routes.MapRoute(
            "Approval",
            "Request/{controller}/{action}",
            new { controller = "Approval", action="Index", id = "" }
        );

    }

しかし、それは機能していません。なんで?ビューに Approval というフォルダがあり、そこに というファイルがありますIndex.cshtml。MapRoute はどのようにコーディングすればよいですか?

編集

私が持っているすべてのルートを追加しました

4

2 に答える 2

5

次のように、2 つの MapRoute ステートメントを入れ替える必要があります。

routes.MapRoute(
    "Approval",
    "Request/Approval/{action}",
    new { controller = "Approval", action="Index", id = "" }
);

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

現在機能していない理由は、最初のステートメント (「デフォルト」ルート名) が 2 番目のステートメントが評価される前に一致するためです。

さらに(上記の例で述べたように)、承認ルートの「{controller}」を削除し、「承認」に置き換える必要があります... URL /Request/{ANY controller}/{action} が特に必要でない限り私はそれを疑います。あなたの質問から、 /Request/Approval/ だけが承認コントローラーに行きたいようです。

他のコントローラーやアクションと一致するように、デフォルト ルートを一番下に置くことを忘れないでください。他に一致するものが存在しない場合は、キャッチオールとして機能します。

于 2012-06-18T19:44:43.997 に答える
1

ルートをマッピングする順序は重要です。2 番目のルートをデフォルト ルートの前に移動します。

ただし、何か/request/somethingが を探すので、まだ問題がありSomethingContollerます。これを修正するには、ルートを次のように変更します。

routes.MapRoute(
        "Approval",
        "Request/Approval/{action}",
        new { controller = "Approval", action="Index", id = "" }
    );
于 2012-06-18T19:46:59.473 に答える