ASP.NET Core MVC调用Web API时Post参数对象为Null的问题
问题:调用Post Employee接口时参数为Null,Get方法正常
当从ASP.NET Core MVC控制器调用Post Employee Web API方法时,API接收的Employee对象参数始终为Null,但Get方法运行正常。
原代码
Web API方法
public ActionResult PostEmployee([FromRoute] Employee employee) { _context.Employees.Add(employee); _context.SaveChanges(); return Conflict(); }
MVC控制器方法
[HttpPost] [ValidateAntiForgeryToken] public async Task<ActionResult> CreateAsync(IFormCollection collection) { try { Employee employee = new Employee(); employee.Eno = Convert.ToInt16(collection["Eno"].ToString()); employee.Ename = collection["Ename"].ToString(); employee.Address = collection["Address"].ToString(); using (HttpClient client = new HttpClient()) { StringContent content = new StringContent(JsonConvert.SerializeObject(employee), Encoding.UTF8, "application/json"); string endpoint = apiBaseUrl + "Employees/PostEmployee"; using (var Response = await client.PostAsync(endpoint, content)) { if (Response.StatusCode == System.Net.HttpStatusCode.OK) { return RedirectToAction(nameof(Index)); } } } return RedirectToAction(nameof(Index)); } catch { return View(); } }
问题原因及修正方案
- 参数绑定错误:API方法用
[FromRoute]是从URL路由中取参数,但客户端是通过请求体发送JSON数据,必须改用[FromBody]绑定请求体中的对象。 - 缺少请求特性标记:API方法未添加
[HttpPost]特性,框架无法识别这是处理Post请求的方法。 - 状态码不匹配:API返回
Conflict()(409状态码),但客户端判断的是OK(200状态码),会导致客户端逻辑不触发。
修正后的Web API方法
[HttpPost] public ActionResult PostEmployee([FromBody] Employee employee) { _context.Employees.Add(employee); _context.SaveChanges(); return Ok(); }
额外优化建议
MVC控制器中可以直接用模型绑定代替IFormCollection,简化代码:
[HttpPost] [ValidateAntiForgeryToken] public async Task<ActionResult> CreateAsync(Employee employee) { try { using (HttpClient client = new HttpClient()) { StringContent content = new StringContent(JsonConvert.SerializeObject(employee), Encoding.UTF8, "application/json"); string endpoint = apiBaseUrl + "Employees/PostEmployee"; using (var Response = await client.PostAsync(endpoint, content)) { if (Response.IsSuccessStatusCode) { return RedirectToAction(nameof(Index)); } } } return RedirectToAction(nameof(Index)); } catch { return View(); } }
内容的提问来源于stack exchange,提问作者asm
相关产品推荐
相关产品推荐

