Angular2调用ASP.NET Core WebAPI PUT接口字符串参数为null求助
解决ASP.NET Core WebAPI与Angular2 Put请求字符串参数为Null的问题
这个坑我之前踩过!核心问题出在ASP.NET Core对[FromBody]简单类型的绑定规则,和Angular默认的请求序列化方式不匹配,具体原因和解决办法我给你拆解下:
为什么参数会是Null?
当你用[FromBody] string status这种简单类型参数时,ASP.NET Core默认期望请求体是纯文本格式(比如直接发送"OPENED"),但Angular的HttpClient在发送请求时,默认会把数据序列化成JSON格式(比如你传的'OPENED'会被转成"\"OPENED\""),后端接收到的不是它期望的纯文本结构,自然就绑定失败返回Null了。
两种解决办法,按需选择
办法一:让Angular发送纯文本请求
修改你的AuthPut方法,指定请求头Content-Type: text/plain,跳过Angular的自动JSON序列化,直接发送原始字符串:
AuthPut(url: string, data: string) { // 构造纯文本请求头 const headers = new HttpHeaders({ 'Content-Type': 'text/plain' }); // 直接传入字符串作为请求体 return this.http.put(url, data, { headers }); }
这样调用this.authService.AuthPut(url, 'OPENED')时,后端就能正确解析到status参数了。
办法二:WebAPI改用DTO类接收参数(更推荐)
如果后续可能需要扩展参数,这种方式更灵活易维护。先定义一个简单的DTO类来包裹你的状态值:
public class UpdateCaseStatusDto { public string Status { get; set; } }
然后修改你的WebAPI动作方法:
[HttpPut("{id}")] public async Task<IActionResult> UpdateCaseStatus(int id, [FromBody] UpdateCaseStatusDto statusDto) { // 这里直接用statusDto.Status就能拿到传入的状态值 // ...你的业务逻辑 }
对应的Angular调用改成发送一个对象:
this.authService.AuthPut(url, { Status: 'OPENED' });
这种方式下,Angular默认的JSON序列化和WebAPI的模型绑定就能完美匹配,不会再出现Null的问题。
内容的提问来源于stack exchange,提问作者Mukil Deepthi
相关产品推荐
相关产品推荐

