【问题标题】:Asp.net Core 2 API POST Objects are NULL?Asp.net Core 2 API POST 对象为空?
【发布时间】:2017-08-24 13:06:42
【问题描述】:

我有一个带有一些测试功能的 .net Core 2 API 设置。 (Visual Studio 2017)

使用邮递员我将原始数据发布到该方法,但模型只是空白?为什么?

        // POST api/Product/test
        [HttpPost]
        [Route("test")]
        public object test(MyTestModel model)
        {
            try
            {
                var a = model.SomeTestParam;

                return Ok("Yey");
            }
            catch (Exception ex)
            {
                return BadRequest(new { message = ex.Message });
            }
        }

        public class MyTestModel
        {
            public int SomeTestParam { get; set; }

        }

【问题讨论】:

    标签: c# api asp.net-core


    【解决方案1】:

    您需要在模型中包含[FromBody] 属性:

    [FromBody] MyTestModel model
    

    请参阅 Andrew Lock 的post 了解更多信息:

    为了在 ASP.NET Core 中正确绑定 JSON,您必须修改您的操作以在参数中包含属性 [FromBody]。这告诉框架使用请求的内容类型标头来决定使用哪个已配置的 IInputFormatter 来进行模型绑定。

    正如 @anserk 在 cmets 中所指出的,这也需要将 Content-Type 标头设置为 application/json

    【讨论】:

    • 他还需要在请求中设置正确的内容类型。它应该是application/json 而不是text
    • ApiController 属性添加到类也可以,然后您就不需要在参数中包含FromBody
    • @Neo 谢谢!在我将框架迁移到 .net core 3.1 并花了 4 个小时试图解决这个问题后,我的课程中缺少 ApiController!
    【解决方案2】:

    要为已接受的答案添加更多信息:

    在不使用属性的情况下自动绑定参数的三个来源:

    表单值:这些是在 HTTP 请求中使用的表单值 POST 方法。 (包括 jQuery POST 请求)。

    Route values:路由提供的一组路由值

    查询字符串:URI 的查询字符串部分。

    请注意,Body 不是其中之一(尽管我认为应该是)。

    因此,如果您有需要从主体绑定的值,则必须使用属性绑定属性。

    昨天这让我大吃一惊,因为我认为 Body 中的参数会自动绑定。

    第二个小点是Body只能绑定一个参数。

    每个用 [FromBody] 修饰的动作最多可以有一个参数。 ASP.NET Core MVC 运行时将读取请求流的责任委托给格式化程序。一旦为某个参数读取请求流,通常就无法再次读取请求流以绑定其他 [FromBody] 参数。

    因此,如果您需要多个参数,则需要创建一个模型类来绑定它们:

    public class InputModel{
       public string FirstName{get;set;}
       public string LastName{get;set;}
    }
    
    [HttpPost]
    public IActionResult test([FromBody]InputModel model)...
    

    The Docs

    【讨论】:

      【解决方案3】:

      我处理这个问题几个小时。这个问题源于几个原因。假设请求是 Reactjs (javascript),后端 (API) 是 Asp .Net Core。

      在请求中,必须在header中设置Content-Type:

      Axios({
                  method: 'post',
                  headers: { 'Content-Type': 'application/json'},
                  url: 'https://localhost:44346/Order/Order/GiveOrder',
                  data: order,
                }).then(function (response) {
                  console.log(response);
                });
      

      在后端(Asp .net core API)你必须有一些设置:

      1.在 Startup --> ConfigureServices:

      #region Allow-Orgin
                  services.AddCors(c =>
                  {
                      c.AddPolicy("AllowOrigin", options => options.AllowAnyOrigin());
                  });
                  #endregion
      

      2。在 Startup --> Configure before app.UseMvc() :

      app.UseCors(builder => builder
                      .AllowAnyOrigin()
                      .AllowAnyMethod()
                      .AllowAnyHeader()
                      .AllowCredentials());
      

      3.在控制器中操作之前:

      [EnableCors("AllowOrigin")]
      

      【讨论】:

        【解决方案4】:

        就我而言,我有 { get;放; } 在我的 .cs 模型中丢失,这导致在 POST 上所有成员都为 null 的对象。

        【讨论】:

          【解决方案5】:

          或者,将[ApiController] 属性添加到您的控制器。

          这多次(相隔数月)对我造成了恼人的影响,我希望这个答案可见。

          【讨论】:

            猜你喜欢
            • 2018-09-20
            • 1970-01-01
            • 1970-01-01
            • 2021-05-24
            • 2017-06-07
            • 2018-02-17
            • 1970-01-01
            • 2020-08-22
            • 2017-12-09
            相关资源
            最近更新 更多