ASP.NET Core MVC相同HttpPost方法在ControllerBase调用时参数为null问题
问题根因
该问题由**[ApiController]特性的默认参数绑定规则差异**引发,具体逻辑如下:
- 继承自
Controller的主控制器通常作为MVC页面控制器使用,默认未添加[ApiController]特性,参数绑定会按优先级依次从路由数据、查询字符串、POST表单体中匹配参数名,所以前端通过$.post提交的表单格式SessionID参数可以正常被识别。 - 继承自
ControllerBase的SessionDataController大概率添加了[ApiController]特性(ASP.NET Core Web API控制器的默认配置),该特性对字符串、值类型等简单类型参数的默认绑定源为查询字符串(URL参数),不会主动读取POST表单体中的字段。你前端代码是将SessionID放在POST的表单体中提交,没有拼接到URL查询参数里,所以后端拿到的参数为null。
Postman测试正常的原因
你使用Postman测试时,大概率是直接将SessionID作为查询参数拼接到了请求URL末尾,符合[ApiController]的默认绑定规则,因此可以正常拿到参数。
修复方案
任选其中一种即可:
- 给
SessionDataController中GetSessionInfo方法的参数添加[FromForm]特性,强制从POST表单体绑定参数:
[HttpPost] public async Task<SessionInfo> GetSessionInfo([FromForm] string SessionID)
- 调整前端请求逻辑,将
SessionID拼接到请求URL的查询参数中:
var url = '@Url.Action("GetSessionInfo", "SessionData")?SessionID=' + selectvalue.toString(); $.post(url, function (data) { $('#txtDateFr').val(data.returnstartdate); $('#txtDateTo').val(data.returnenddate); },'json')
内容的提问来源于stack exchange,提问作者Emily
相关产品推荐
相关产品推荐

