Asp.net Core 2 API POST对象是NULL吗?

时间:2017-08-24 13:06:42

标签: c# api asp.net-core

我有一个带有一些测试功能的.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; }

        }

enter image description here

enter image description here

4 个答案:

答案 0 :(得分:25)

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

[FromBody] MyTestModel model

有关详细信息,请参阅Andrew Lock的post

  

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

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

答案 1 :(得分:3)

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

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

  

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

     

路由值:路由

提供的路由值集      

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

请注意Body不是其中之一(虽然我认为应该是这样)。

因此,如果您需要从正文绑定值,则必须使用属性绑定属性。

这让我在昨天绊倒了,因为我认为Body的参数会自动绑定。

第二个要点是只能将一个参数绑定到Body。

  

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

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

public class InputModel{
   public string FirstName{get;set;}
   public string LastName{get;set;}
}

[HttpPost]
public IActionResult test([FromBody]InputModel model)...

The Docs

答案 2 :(得分:0)

我处理了几个小时。该问题源于几个原因。让我们考虑一下请求是Reactjs(javascript),后端(API)是Asp .Net Core。

在请求中,必须在标题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核心API)中,您必须进行一些设置:

1。在启动-> ConfigureServices

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

2。在启动->在app.UseMvc()之前配置

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

3。在控制器中先执行以下操作:

[EnableCors("AllowOrigin")]

答案 3 :(得分:0)

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