ASP.NET MVC5无法接收Get参数及路由匹配失败问题求助
嘿,咱们来一步步拆解你遇到的问题——其实核心根源是你没启用特性路由(Attribute Routing),这直接导致了后续的两个异常情况。下面给你详细的修复方案:
1. 先启用特性路由(关键第一步)
ASP.NET MVC5默认是不开启特性路由的,所以你在Action上写的[Route]注解完全没生效!打开你的RouteConfig.cs,在默认路由注册之前加上routes.MapMvcAttributeRoutes(),修改后的代码如下:
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); // 必须先启用特性路由,这行要放在默认路由前面! routes.MapMvcAttributeRoutes(); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); }
这一步是基础,没做的话后面的操作都白搭。
2. 让Url.Action生成正确的路由式URL
现在特性路由启用了,你有两种方式让Url.Action生成符合你预期的URL:
方式一:给路由命名(推荐,更清晰)
给你的[Route]特性加个名称,这样生成URL时可以直接指定路由名,避免歧义:
[HttpGet] // 加上Name属性,方便生成URL [Route("~/obtenerAngulos/{Conex_AT}/{Conex_BT}", Name = "GetAngulos")] public JsonResult obtenerAngulos(string Conex_AT, string Conex_BT) { return Json(new { AT = Conex_AT, BT = Conex_BT }, JsonRequestBehavior.AllowGet); }
然后生成URL时用Url.RouteUrl指定路由名:
var targetUrl = Url.RouteUrl("GetAngulos", new { Conex_AT = "Y", Conex_BT = "y" });
这样生成的URL就是http://localhost:53645/obtenerAngulos/Y/y,完全符合你的路由模板。
方式二:直接用Url.Action传递参数
如果不想给路由命名,直接传递参数也可以,只要参数名和路由模板里的一致:
var targetUrl = Url.Action("obtenerAngulos", "Base", new { Conex_AT = "Y", Conex_BT = "y" });
启用特性路由后,MVC会自动匹配到你定义的路由模板,生成路由式URL而不是查询字符串。
3. 解决第二个参数Conex_BT为null的问题
你之前生成的URL里出现了&(这是HTML编码后的&符号),如果直接用这个编码后的字符串发起请求,服务器会把第二个参数识别为amp;Conex_BT=y,自然接收不到正确的Conex_BT值。
解决方法:
- 如果是在Razor视图中输出URL,用
@Html.Raw(targetUrl)避免HTML编码; - 如果是在控制器里生成并使用URL,直接用生成的原始字符串就好,不会有编码问题。
4. 修复手动访问URL的404错误
你之前手动访问的是/Base/obtenerAngulos/AA/BB,但你的路由模板用了~/前缀,这表示这是一个根路径路由,不需要带控制器名称Base!所以正确的URL应该是http://localhost:53645/obtenerAngulos/AA/BB。
如果希望路由包含控制器名称(比如保留/Base/前缀),修改你的[Route]特性即可:
// 要么指定固定控制器 [Route("Base/obtenerAngulos/{Conex_AT}/{Conex_BT}")] // 要么用占位符匹配任意控制器 [Route("{controller}/obtenerAngulos/{Conex_AT}/{Conex_BT}")]
这样再访问/Base/obtenerAngulos/AA/BB就不会404了。
内容的提问来源于stack exchange,提问作者Juan Salvador Portugal

