.NET Core 6 ApiController无法处理int/string类型参数的问题
解决ApiController同时支持接收模型与基础类型参数的问题
一、修复单个基础类型参数的接收问题
你的控制器无法接收int这类基础类型参数,核心原因是ASP.NET Core默认不会从JSON请求体中绑定简单类型参数,需要显式指定参数来源。
1. 修改控制器代码
给int id参数添加[FromBody]特性,明确告诉框架从请求体读取数据:
[Route("Get"), HttpPost] public async Task<JResultModel> Get([FromBody] int id) { if (id == -1) // 你的业务逻辑代码 return _JResult.Control(model); }
2. 匹配AJAX请求数据格式
如果你的data是单个数值(比如let data = 123),直接序列化即可:
$.ajax({ url: postUrl, data: JSON.stringify(data), // 序列化后为"123" contentType: 'application/json', type: 'POST', success: function (resultData) { console.log(resultData); return resultData; } });
如果data是包含id的对象(比如let data = {id: 123}),可改用动态类型或自定义模型接收:
[Route("Get"), HttpPost] public async Task<JResultModel> Get([FromBody] dynamic request) { int id = request.id; // 你的业务逻辑代码 return _JResult.Control(model); }
二、实现同时支持模型与基础类型的通用方案
如果需要同一接口或不同接口兼容两种参数类型,可采用以下两种方案:
1. 重载Action方法
为不同参数类型定义独立的Action,通过路由区分:
// 处理基础类型int [Route("Get/ById"), HttpPost] public async Task<JResultModel> GetById([FromBody] int id) { // 对应业务逻辑 } // 处理自定义模型 [Route("Get/ByModel"), HttpPost] public async Task<JResultModel> GetByModel([FromBody] YourCustomModel model) { // 对应业务逻辑 }
2. 使用统一包装模型
定义通用包装类,兼容基础类型和自定义模型:
public class RequestWrapper<T> { public T Data { get; set; } } // 控制器接收包装类 [Route("Get"), HttpPost] public async Task<JResultModel> Get([FromBody] RequestWrapper<object> request) { if (request.Data is int id) { // 处理int类型逻辑 } else if (request.Data is YourCustomModel model) { // 处理模型逻辑 } // 其他类型处理逻辑 return _JResult.Control(resultModel); }
对应的AJAX请求需要将数据包装在Data字段中:
// 发送int类型数据 let data = { Data: 123 }; // 发送自定义模型数据 let data = { Data: { Name: "测试", Id: 456 } }; $.ajax({ url: postUrl, data: JSON.stringify(data), contentType: 'application/json', type: 'POST', success: function (resultData) { console.log(resultData); return resultData; } });
关键注意事项
- 务必保持请求的
contentType为application/json,否则框架会按表单数据解析,无法正确绑定JSON格式参数。 - 简单类型参数必须显式添加
[FromBody]特性,否则ASP.NET Core会尝试从URL查询字符串或表单中读取,导致绑定失败。
内容的提问来源于stack exchange,提问作者DORE
相关产品推荐
相关产品推荐

