C# Asp.net Core 2 API POST对象是否为空?

C# Asp.net Core 2 API POST对象是否为空?,c#,api,asp.net-core,C#,Api,Asp.net Core,我有一个带有一些测试功能的.NETCore2API设置。(Visual Studio 2017) 我使用postman将原始数据发布到该方法,但模型只是空白?为什么? // POST api/Product/test [HttpPost] [Route("test")] public object test(MyTestModel model) { try {

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

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

        // 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; }

        }


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

[FromBody] MyTestModel model
有关更多信息,请参阅Andrew Lock's:

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


正如@anserk在评论中指出的,这还需要将
内容类型
标题设置为
application/json

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

有三个源,参数从中自动绑定而不使用属性:

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

路由值:路由提供的路由值集

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

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

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

这让我昨天大吃一惊,因为我假设来自身体的参数会自动绑定

第二个次要问题是,只有一个参数可以绑定到主体

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

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

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

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

我花了几个小时来处理这个问题。这个问题有几个原因。让我们考虑的请求是Reactjs(JavaScript)和后端(API)是ASP.NET.Cype。 在请求中,必须在标题内容类型中设置:

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。在启动-->配置服务中

#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")]

在我的例子中,我的.cs模型中缺少了{get;set;},这导致一个所有成员在POST上都为空的对象。

他还需要在请求中设置正确的内容类型。它应该是
application/json
而不是
text
。将
ApiController
属性添加到类中也会起作用,这样您就不需要在参数中包含
FromBody
。@Neo谢谢!在我将框架迁移到.NETCore3.1并花了整整4个小时试图解决这个问题之后,我错过了类中的ApiController!!