MVC:将路由属性与具有附加段的 url 一起使用

MVC: Using the routing attribute with a url that has an additional segment

我有一个名为 Search 的控制器。正常的 url 将是以下内容:

这会在我的 SearchController.

中触发我的 ByCity 操作

然而,现在 url 如下例,还需要在 SearchController 中点击一个动作:

如果 url 包含“Pharmacy/ByCity”,我需要以某种方式告诉我的 SearchController 以转到 ByCity 操作。

我已经尝试使用路由属性,但我的应用程序仍然改为点击我的旧 Pharmacy 操作。

在我的 RouteConfig 中,我有这个:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.MapMvcAttributeRoutes();   
}

然后,在我的 SearchController 中,我有这个:

public virtual ActionResult Pharmacy()
{
    //this is an existing action, which gets hit, even when I type in "Pharmacy/ByCity", which is not what I want to happen.
}

[Route("Pharmacy/ByCity")]
public virtual ActionResult ByCity()
{
    //this never gets hit
}

知道如何让包含“Pharmacy/ByCity”的 url 触发我的“ByCity”操作,而不是“Pharmacy”吗?

谢谢

根据路由中的顺序访问路由 table。

对于常规路由 (RouteConfig.cs),您可以在默认路由之前添加您的特定路由。

  1. 删除控制器中的 Route[] 属性
  2. 使用下面的代码进行 RouteConfig
public static void RegisterRoutes(RouteCollection routes)
{
   routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

   // add your specific route, before the default route
   routes.MapRoute(
      name: "SearchByCity", // random name
      url: "Search/Pharmacy/ByCity",
      defaults: new { controller = "Search", action = "ByCity" }
   );
   
   // this is the default route
   routes.MapRoute(
      name: "Default",
      url: "{controller}/{action}/{id}",
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
   );
}

如果您想使用属性路由,请按照以下步骤操作。

  1. 删除RouteConfig中的默认路由。
public static void RegisterRoutes(RouteCollection routes)
{
   routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
   routes.MapMvcAttributeRoutes();
}
  1. 然后使用下面的控制器,我们使用RoutePrefix作为控制器,Route作为动作。
[RoutePrefix("Search")]
public class SearchController : Controller
{
   [Route("Pharmacy")]
   public virtual ActionResult Pharmacy()
   {
      return View("index");
   }

   [Route("Pharmacy/ByCity")]
   public virtual ActionResult ByCity()
   {
      return View("index");
   }
}

通过如下设置可以用常规路由实现:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
    name: "Pharmacy",
    url: "{clientname}/{controller}/Pharmacy/{action}",
    defaults: new { controller = "search" }
);

routes.MapRoute(
    name: "Search",
    url: "{clientname}/{controller}/{action}",
    defaults: new { controller = "search", action = "Index" }
);          

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