IE11下Razor Pages的OnGet方法路由参数id无法正常绑定问题求助
根因分析
这个问题是IE11的重定向请求头处理逻辑和ASP.NET Core默认参数绑定规则冲突导致的,具体触发逻辑如下:
- IE11处理XMLHttpRequest触发的302重定向时,会错误保留原POST请求的
Content-Type: application/x-www-form-urlencoded请求头,哪怕重定向后的请求是GET类型,不符合HTTP规范要求。 - ASP.NET Core的Razor Pages参数绑定会按照优先级探测绑定源:如果请求头携带表单类型的Content-Type,会优先从请求表单域中提取参数,而你的重定向GET请求本身没有提交任何表单数据,因此id参数绑定结果为null。
- Chrome浏览器符合规范,重定向到GET请求时会自动清除原POST请求的Content-Type头,因此绑定逻辑会正常从路由中提取id值,没有异常。
- 你通过
GetRouteValue能正常拿到值,是因为路由匹配逻辑不受Content-Type头影响,路由数据已经正常解析完成,只是模型绑定阶段选错了参数提取来源。
修复方案
你可以任选以下一种方案修复:
- 显式指定参数绑定来源:给OnGet方法的id参数添加
[FromRoute]特性,强制从路由数据中读取参数,跳过默认的绑定源探测,修改后代码如下:
public async Task<IActionResult> OnGet([FromRoute] string id) { // 原有逻辑无需修改 var intId = _accessor.HttpContext.GetRouteValue("id")?.ToString(); var values = _accessor.HttpContext.GetRouteData().Values; // 其余逻辑省略 return Page(); }
- 中间件层兼容IE11异常:在请求管道中添加中间件,清除GET请求异常携带的表单Content-Type头:
// Program.cs 中放在路由匹配之前 app.Use(async (context, next) => { if (context.Request.Method == HttpMethod.Get.Method && context.Request.ContentType?.StartsWith("application/x-www-form-urlencoded") == true) { context.Request.ContentType = null; } await next(); });
- 直接使用已解析的路由值:保持现有代码逻辑不变,直接使用
_accessor.HttpContext.GetRouteValue("id")获取id值即可。
内容的提问来源于stack exchange,提问作者Jon Selby
相关产品推荐
相关产品推荐

