Asp.net mvc 3 构建MVC路线

Asp.net mvc 3 构建MVC路线,asp.net-mvc-3,asp.net-mvc-4,Asp.net Mvc 3,Asp.net Mvc 4,我有下面的url结构,只是试图找出最佳的路由配置 编辑:添加更多url /cars/{name}(显示有关汽车的一般信息) /汽车/{name}/车型(显示特定汽车的车型列表) /汽车/{name}/models/{id}(显示特定汽车的特定型号) /cars/{name}/models/edit(添加一个新模型,这将是一个操作) /汽车/{name}/models/{id}/owner(特定车型的车主列表) /汽车/{name}/models/{id}/owner/create(添加新所有者)

我有下面的url结构,只是试图找出最佳的路由配置

编辑:添加更多url

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

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

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

/cars/{name}/models/edit(添加一个新模型,这将是一个操作)

/汽车/{name}/models/{id}/owner(特定车型的车主列表)

/汽车/{name}/models/{id}/owner/create(添加新所有者)

到目前为止,我已经

         routes.MapRoute(
            name: "CarReleases",
            url: "cars/{name}/models/{id}",
            defaults:
                new
                    {
                        controller = "Releases",
                        action = "Index",
                        id = UrlParameter.Optional
                    }
            );
如果我使用/cars/{name}/models,这是可行的,但是很明显,我没有可用于models页面的操作。我必须为这种情况创建新的路线图吗

我还有CarController,其映射如下:

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

正如您所看到的,我有一个操作和动态请求的混合体。有点混淆了将此信息放入maproutes的最佳方式。

从最具体的到最不具体的路径排序。在我的示例中,所有动作都映射到控制器
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){}

试过了,但我觉得不太合适。我对这个问题做了一些修改,也许有助于进一步解释问题。这比我想象的要复杂一点。当你把{action}放在路由中时,这是否意味着请求url中需要它?e、 g./cars/camaro/models/list/2013、/cars/camaro/models(将起作用),/cars/camaro/edit。由于您指定了默认值,所以它不是必需的,在我的示例中是索引。但是您当然可以将其更改为
List
so/cars/camaro/models将起作用,并将在控制器中路由到List操作。我理解这一点,但在以下场景中:/cars/camaro/models,/cars/camaro/models/2013第一个映射到默认的List操作,第二个则在url中没有操作。在没有/cars/camaro/models/model/2013等的情况下,如何映射该请求?我宁愿把它弄干净。如果id存在,我是否必须在主列表操作中添加RedirectToAction?可以使用id参数创建索引操作。然后,检查是否提供了id,并根据该id显示列表或单个元素。默认情况下,MVC模板提供一个
详细信息
操作。因此,您需要
/cars/camaro/models/details/2013