0

次の URL 構造があり、構成するのに最適なルートを見つけようとしています。

編集:さらにURLを追加しました

/cars/{name} (車に関する一般的な情報を表示します)

/cars/{name}/models (特定の車のモデルのリストを表示します)

/cars/{name}/models/{id} (特定の車の特定のモデルを表示)

/cars/{name}/models/edit (アクションとなる新しいモデルを追加)

/cars/{name}/models/{id}/owners (特定のモデルの所有者のリスト)

/cars/{name}/models/{id}/owners/create (新しい所有者を追加)

これまでのところ、私は

         routes.MapRoute(
            name: "CarReleases",
            url: "cars/{name}/models/{id}",
            defaults:
                new
                    {
                        controller = "Releases",
                        action = "Index",
                        id = UrlParameter.Optional
                    }
            );

これは、/cars/{name}/models を使用すると機能しますが、明らかに、モデル ページで使用できるアクションがありません。この状況では、新しいルート マップを作成する必要がありますか?

次のようにマッピングされた CarController もあります。

          routes.MapRoute(
            name: "Cars",
            url: "cars/{name}/{action}",
            defaults: new { controller = "Cars", action = "Details", id = UrlParameter.Optional }
            );

ご覧のとおり、アクションと動的リクエストが一般的に混在しています。これをmaprouteに入れる最良の方法を少し混乱させました。

4

1 に答える 1

0

最も具体的なものから最も具体的でないものへとルートを並べ替えます。私の例では、すべてのアクションがコントローラーにマップされていCarsます。ただし、それらを分離することはできます。例えば:

所有者:

routes.MapRoute(
            name: "owners",
            url: "cars/{name}/models/{id}/owners/{action}/{ownerId} ",
            defaults: new { controller = "Cars", action = "OwnerIndex", id = UrlParameter.Optional, ownerId = UrlParameter.Optional }
            );

モデル:

routes.MapRoute(
            name: "models",
            url: "cars/{name}/models/{action}/{id}",
            defaults: new { controller = "Cars", action = "ModelIndex", id = UrlParameter.Optional }
            );

車:

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

デフォルトのアクションがインデックスに変更されていることに注意してください。これにより、アクションとIDを省略した場合にすべてが一覧表示されます(すべてを1つのコントローラーに保持する場合は変更が必要になる場合があります)

それらを1つのコントローラーにまとめるべきかどうかという質問については、管理機能(編集、削除など)を表示から分離したい場合を除いて、それで問題ないと思います。いずれの場合でも、1つのコントローラーにそれらを配置し、Authorize属性を追加するだけで済みます。

[Authorize(Roles = "admin")]
public ViewResult Delete(int id){}
于 2013-01-16T22:33:42.340 に答える