MVC:将路由属性与具有附加段的 url 一起使用
MVC: Using the routing attribute with a url that has an additional segment
我有一个名为 Search 的控制器。正常的 url 将是以下内容:
localhost:44351/<ClientName>/Search/ByCity
这会在我的 SearchController
.
中触发我的 ByCity 操作
然而,现在 url 如下例,还需要在 SearchController 中点击一个动作:
localhost:44351/<ClientName>/Search/Pharmacy/ByCity
如果 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),您可以在默认路由之前添加您的特定路由。
- 删除控制器中的
Route[]
属性
- 使用下面的代码进行 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 }
);
}
如果您想使用属性路由,请按照以下步骤操作。
- 删除RouteConfig中的默认路由。
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();
}
- 然后使用下面的控制器,我们使用
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 }
);
我有一个名为 Search 的控制器。正常的 url 将是以下内容:
localhost:44351/<ClientName>/Search/ByCity
这会在我的 SearchController
.
然而,现在 url 如下例,还需要在 SearchController 中点击一个动作:
localhost:44351/<ClientName>/Search/Pharmacy/ByCity
如果 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),您可以在默认路由之前添加您的特定路由。
- 删除控制器中的
Route[]
属性 - 使用下面的代码进行 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 }
);
}
如果您想使用属性路由,请按照以下步骤操作。
- 删除RouteConfig中的默认路由。
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();
}
- 然后使用下面的控制器,我们使用
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 }
);