MVC 路由配置样式
MVC RouteConfig Style
在我的 table 中有两个链接:
@Html.ActionLink("Edit", "Edit", new { id = item.Id }) |
@Html.ActionLink("Events", "LocationEvents", "Events", new {locationId = item.Id}, null)
现在我的目标是,当我将鼠标悬停在链接上时,我希望 url 看起来像这样:
/Locations/Edit/4
/Events/LocationEvents/4
但是,我得到这个:
/Locations/Edit?id=4
/Events/LocationEvents/4
这是我的RouteConfig.cs
routes.MapRoute(
name: "Events",
url: "{controller}/{action}/{locationId}",
defaults: new {controller = "Locations", action = "Index", locationId = UrlParameter.Optional}
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Locations", action = "Index", id = UrlParameter.Optional }
);
我该如何进行这项工作?
简单地说,你不能有这样的两条路线。它们在功能上是相同的,采用控制器、操作和某种 id 值。 id 参数名称不同这一事实不足以区分路由。
首先,您需要通过对其中一个参数进行硬编码来区分路由。例如,您可以这样做:
routes.MapRoute(
name: "Events",
url: "Events/{action}/{locationId}",
defaults: new {controller = "Locations", action = "Index", locationId = UrlParameter.Optional}
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Locations", action = "Index", id = UrlParameter.Optional }
);
那么,第一条路由只会匹配以"Events"开头的URL。否则,将使用默认路由。当客户端请求 URL 时,这是正确处理路由所必需的。它仍然无法帮助您生成路线,因为 UrlHelper
没有足够的信息来确定选择哪一个。为此,您需要使用路由名称来明确告诉它使用哪一个:
@Html.RouteLink("Default", new { controller = "Edit", action = "edit", id = item.Id })
坦率地说,RouteConfig 风格的路由是一个巨大的痛苦。除非,你正在处理一个非常简单的结构,几乎可以通过默认路由处理,那么你最好使用属性路由,你可以在其中描述每个操作应该具有的确切路由。例如:
[RoutePrefix("Events")]
public class EventsController : Controller
{
...
[Route("LocationEvents", Name = "LocationEvents")]
public ActionResult LocationEvents(int locationId)
{
...
}
}
然后,它是绝对显式的,如果你想确保你得到的是正确的路线,你可以只使用名称(结合 Html.RouteLink
、Url.RouteUrl
等.).
在我的 table 中有两个链接:
@Html.ActionLink("Edit", "Edit", new { id = item.Id }) |
@Html.ActionLink("Events", "LocationEvents", "Events", new {locationId = item.Id}, null)
现在我的目标是,当我将鼠标悬停在链接上时,我希望 url 看起来像这样:
/Locations/Edit/4
/Events/LocationEvents/4
但是,我得到这个:
/Locations/Edit?id=4
/Events/LocationEvents/4
这是我的RouteConfig.cs
routes.MapRoute(
name: "Events",
url: "{controller}/{action}/{locationId}",
defaults: new {controller = "Locations", action = "Index", locationId = UrlParameter.Optional}
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Locations", action = "Index", id = UrlParameter.Optional }
);
我该如何进行这项工作?
简单地说,你不能有这样的两条路线。它们在功能上是相同的,采用控制器、操作和某种 id 值。 id 参数名称不同这一事实不足以区分路由。
首先,您需要通过对其中一个参数进行硬编码来区分路由。例如,您可以这样做:
routes.MapRoute(
name: "Events",
url: "Events/{action}/{locationId}",
defaults: new {controller = "Locations", action = "Index", locationId = UrlParameter.Optional}
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Locations", action = "Index", id = UrlParameter.Optional }
);
那么,第一条路由只会匹配以"Events"开头的URL。否则,将使用默认路由。当客户端请求 URL 时,这是正确处理路由所必需的。它仍然无法帮助您生成路线,因为 UrlHelper
没有足够的信息来确定选择哪一个。为此,您需要使用路由名称来明确告诉它使用哪一个:
@Html.RouteLink("Default", new { controller = "Edit", action = "edit", id = item.Id })
坦率地说,RouteConfig 风格的路由是一个巨大的痛苦。除非,你正在处理一个非常简单的结构,几乎可以通过默认路由处理,那么你最好使用属性路由,你可以在其中描述每个操作应该具有的确切路由。例如:
[RoutePrefix("Events")]
public class EventsController : Controller
{
...
[Route("LocationEvents", Name = "LocationEvents")]
public ActionResult LocationEvents(int locationId)
{
...
}
}
然后,它是绝对显式的,如果你想确保你得到的是正确的路线,你可以只使用名称(结合 Html.RouteLink
、Url.RouteUrl
等.).