构建MVC路由

时间:2013-01-16 22:24:04

标签: asp.net-mvc-3 asp.net-mvc-4

我有以下网址结构,只是想弄清楚要配置的最佳路由。

编辑:添加了更多网址

/ cars / {name}(显示有关汽车的一般信息)

/ cars / {name} / models(显示特定汽车的模型列表)

/ cars / {name} / models / {id}(显示特定车型的特定型号)

/ cars / {name} / models / edit(添加一个新动作模型)

/ cars / {name} / models / {id} / owner(特定型号的所有者列表)

/ 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 }
            );

如您所见,我有一般动作和动态请求的混合。有点混淆将其放入maproutes的最佳方式。

1 个答案:

答案 0 :(得分: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时,它会列出所有操作(如果您决定将它们全部保存在一个控制器中,则可能需要更改它)

关于你是否应该将它们保存在一个控制器中的问题,我认为这很好,除非你想将管理功能(编辑,删除等)与查看区分开来。在任何情况下,您仍然可以将它们放在一个控制器中,只需添加Authorize属性即可。

[Authorize(Roles = "admin")]
public ViewResult Delete(int id){}