You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();
    }
}

问题原因及修正方案

  1. 参数绑定错误:API方法用[FromRoute]是从URL路由中取参数,但客户端是通过请求体发送JSON数据,必须改用[FromBody]绑定请求体中的对象。
  2. 缺少请求特性标记:API方法未添加[HttpPost]特性,框架无法识别这是处理Post请求的方法。
  3. 状态码不匹配: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 10:20:43