Asp.Net Core路由默认Action不生效:Url.RouteUrl生成异常URL
这个问题的核心在于ASP.NET Core中Url.RouteUrl的参数复用机制,不是路由默认配置的问题,而是这个方法的行为逻辑导致的。
为什么会出现这个现象?
当你调用@Url.RouteUrl("Address")时,没有显式指定action参数,此时框架会自动复用当前请求上下文(HttpContext)中已有的路由值,而不是直接使用你在MapRoute里定义的默认值。
举个例子:如果当前你正在访问的页面是address-info/anotherAction(也就是当前请求的action路由值是anotherAction),那么调用不带参数的Url.RouteUrl("Address")时,框架会把这个已有的anotherAction填充到路由模板的{action}位置,最终生成http://localhost/address-info/anotherAction。
而当你显式指定new {action="Index"}时,你覆盖了上下文的路由值,所以框架会使用你指定的Index,匹配路由默认规则后生成正确的http://localhost/address-info。
怎么解决?
有几种方式可以让你在不每次显式写action="Index"的情况下,得到预期的URL:
显式覆盖action参数(最直接)
即使你想使用默认值,也显式指定action为Index,确保上下文的路由值不会被复用:@Url.RouteUrl("Address", new { action = "Index" })清除上下文的路由值
你可以创建一个空的RouteValueDictionary并指定默认值,避免上下文值干扰:@Url.RouteUrl("Address", new RouteValueDictionary { { "action", "Index" } })封装自定义UrlHelper扩展(更优雅)
如果这个路由经常被使用,可以写一个扩展方法,封装默认参数的逻辑:public static class UrlHelperExtensions { public static string AddressRouteUrl(this IUrlHelper urlHelper) { return urlHelper.RouteUrl("Address", new { action = "Index" }); } }之后在视图里直接调用:
@Url.AddressRouteUrl()
验证思路
你可以在Address/Index页面里调用@Url.RouteUrl("Address"),此时生成的URL应该是正确的http://localhost/address-info,因为当前上下文的action路由值就是Index,和路由默认值一致。这也能侧面验证我们的分析是正确的。
内容的提问来源于stack exchange,提问作者Yargicx

