0

1つのサンプルインターネットMVCアプリケーションを作成しました。次に、インデックスビューでProductsControllerを作成しました。

次に、ルーティングで、以下のルーティングルールを使用して製品のURLをproducts / prodname/idにマッピングしました。

routes.MapRoute(
                name: "ProdDef",
                url: "{controller}/{name}/{id}/{action}",
                defaults: new { controller = "Products", action = "Index", id = UrlParameter.Optional, name = UrlParameter.Optional }
            );

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );

しかし、この後、連絡先ページは私をホームインデックスコントローラーアクションにリダイレクトします。?? なぜそうなのか?製品のルールを1つだけ作成した後、何かが足りないのでしょうか。また、他のアクションが機能しなくなったのはなぜですか。

4

1 に答える 1

3

最初のルートを次のようなものに変更します

routes.MapRoute(
    name: "ProdDef",
    url: "products/{name}/{id}/{action}",
    defaults: new { controller = "Products", action = "Index", id = UrlParameter.Optional, name = UrlParameter.Optional }
);

そうでなければ、そのルートはほとんど何にでも一致します。マッチングはその順序で試行されるため、ルートの順序が重要であることを忘れないでください。

編集 :

この理由は、デフォルトではルーティングハンドラーがとの間{controller}/{name}に違いをもたらさないため{controller}/{action}です。これらは同じ形式ですが、パラメーター名が異なります。

これは、たとえばのような特定のURLで何が起こるかの内訳です/Home/Index

最初のルートが最初に試行され、4つのパラメーターがあります。そのうちの2つはオプションであるため、値が存在しない場合は値が指定されず、次の値が残ります。

  • コントローラー:ホーム
  • 名前:インデックス
  • アクション:nullですが、デフォルトで指定されたインデックスになります
  • id:null

ご覧のとおり、オプションではない両方のパラメーターが入力されているため、ルートは一致しますが、期待どおりに機能しません。controllerとの値があれば、URLが何であっても同じことが起こりますname。これが私の最初の答えになります。最初のルートを製品の受信URLのみに一致させたい場合は、ルーティングハンドラーがそれを区別できるようにするものを追加する必要があります。{controller}ハードコードされた値を、に置き換えることでproducts、そのルートは製品で始まる着信URLとのみ一致し、他のものは期待どおりにルートチェーンをたどり続けます。

それがあなたのためにそれをクリアすることを願っています。

于 2013-01-30T18:19:42.063 に答える