8

いくつかのカスタム マップ ルートを作成しようとしていますが、うまく機能しません。

私の最終的な目標は、次のようなものを指定できるようにすることです。基本的に、URL は "id" と "name" の値のペアで構成されています。名前は無関係であり、ユーザーの楽しみのためにのみ使用されますが、コントローラーで ID が必要になります。

/dashboards/5-My-Estate-name/89-My-subgroup-name/133-Maybe-even-another-subgroup

手始めに、私は最初のセクションに取り組んでいて、問題を抱えています。

次のルートを使用して「http://localhost:53933/dashboards/109-building-xyz」を参照すると、エラーが発生しますA public action method '109-building-xyz' was not found on controller 'MyInterfaceInterface.Controllers.DashboardsController'.

routes.MapRoute(
  "Dashboard",
  "dashboards/{id}-{name}", // URL pattern
   new { controller = "Dashboards", action = "Index" },
   new { id = @"\d+", name = UrlParameter.Optional }
);

明らかに、これをパラメーター付きの Index 関数にルーティングしたかったのです。

私は何を間違っていますか?これを正しく構造化していますか?私は Web-PHP のバックグラウンドから来ており、htaccess を使用してそのようなことを達成しています。

ありがとう

4

1 に答える 1

9

ルートの順序は重要です。MVC は、最初に宣言されたルートを URL パターンと一致するパターンと一致させます。

したがって、これがある場合:

routes.MapRoute(
  "Default",
  "{controller}/{action}/{id}", // URL pattern
   new { controller = "Home", action = "Index" },
   new { id = UrlParameter.Optional }
);
routes.MapRoute(
  "Dashboard",
  "dashboards/{id}-{name}", // URL pattern
   new { controller = "Dashboards", action = "Index" },
   new { id = @"\d+", name = UrlParameter.Optional }
);

次に、URL で何が起こるかというとhttp://localhost:53933/dashboards/109-building-xyz、MVC は "dashboards" をコントローラーに、"109-building-xyz" をアクションに一致させます。

次のように、常に最も具体的なルートを最初に宣言し、その後でより一般的なルートを宣言する必要があります。

routes.MapRoute(
  "Dashboard",
  "dashboards/{id}-{name}", // URL pattern
   new { controller = "Dashboards", action = "Index" },
   new { id = @"\d+", name = UrlParameter.Optional }
);
routes.MapRoute(
  "Default",
  "{controller}/{action}/{id}", // URL pattern
   new { controller = "Home", action = "Index" },
   new { id = UrlParameter.Optional }
);

ただし、Morten Mertner のコメントは正しいです。スラッシュで区切られていない 2 つのルート パラメーターを持つことはできないと思います。デフォルトのルーティング エンジンで使用するには、URL パターンを次のように変更する必要があります。

"dashboards/{id}/{name}"
于 2012-05-23T16:10:13.903 に答える