【问题标题】:MVC 5: Controller's action based routingMVC 5:控制器基于动作的路由
【发布时间】:2014-03-18 08:24:33
【问题描述】:

有没有办法根据控制器的操作进行不同的路由?

例如:

默认路由

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

这会使网址看起来像

localhost:/Home/{someaction}/{id}

如果控制器的动作是

public ActionResult SomeAction(int id)
{
   return Content("Sup?");
}

但假设我有这个动作

public ActionResult AnotherAction(Guid productCategoryId, Guid productId)
{
   return content("Hello!");
}

如果我没有任何自定义路由,那么路由看起来像

localhost:/Home/AnotherAction?productCategoryId=someGuidId&productId=someGuidId

但是如果我希望路线看起来像这个动作

localhost/Home/AnotherAction/productCategoryGuidId/productGuidId

我该怎么做?

我添加了一条自定义路线

    routes.MapRoute(
        name: "appointment",
        url: "{controller}/{action}/{appointmentId}/{attendeeId}",
        defaults: new {controller = "Home",action = "Index", appointmentId = "",attendeeId="" }
    );

但是我如何说控制器的操作是使用该路由而不是默认路由。

另外,我读到 MVC 5 中有 attribute routing。这对我的情况有帮助吗?我将如何使用它?

【问题讨论】:

  • 自定义路线是要走的路。一定要先添加,最后指定默认路由。
  • 所以如果我有自定义路由,我不必告诉我的控制器使用具有特定名称的路由映射?
  • 你可以。我真的无法提供反驳的论据。也许,在可扩展性方面,使用该属性会更好。如果您有另一个(或许多其他)操作需要使用此路由,会发生什么?你需要装饰每个动作。如果您正确设置了路由,服务器会自动为您执行此操作。根据经验,您需要首先设置最具体的路线,最后设置最通用的路线。正如@lnanikian 所提到的,路线是按照它们定义的顺序检查的。找到有效规则后,将不再检查其他规则。一般路线将始终匹配。
  • 感谢您的建议

标签: asp.net-mvc asp.net-mvc-routing url-routing asp.net-mvc-5


【解决方案1】:

在您的默认路线之前注册您的自定义 MapRoute。先来的顺序在表路由中计数。 路由按照它们在 RouteCollection 中出现的顺序应用 目的。 MapRoute 方法在集合的末尾添加一个路由,这意味着路由一般是按照我们添加它们的顺序应用的。

希望对你有帮助

【讨论】:

    猜你喜欢
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    • 2013-12-05
    相关资源
    最近更新 更多