C# MVC RouteConfig样式
在我的表格中,我有两个链接:C# MVC RouteConfig样式,c#,asp.net-mvc-5,routeconfig,C#,Asp.net Mvc 5,Routeconfig,在我的表格中,我有两个链接: @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 然而,我得
@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
这是我的路线图
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 }
);
然后,第一条路由将只匹配以“事件”开头的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
,等等一起使用)。简单地说,你不能有两条这样的路线。它们在功能上是相同的,使用一个控制器、动作和某种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 }
);
然后,第一条路由将只匹配以“事件”开头的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
等结合使用).两条路由都根据模板匹配。我如何根据参数匹配它们?两条路由根据模板匹配。我如何根据参数匹配它们?明白。谢谢你的帮助!您的第一个解决方案有效:)明白。谢谢你的帮助!您的第一个解决方案正在运行:)