You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET MVC5无法接收Get参数及路由匹配失败问题求助

解决ASP.NET MVC5路由配置与参数接收的双重问题

嘿,咱们来一步步拆解你遇到的问题——其实核心根源是你没启用特性路由(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:02:40