Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .Net核心模型将JSON Post绑定到Web API_C#_Asp.net Core_Asp.net Web Api2_Model Binding_Asp.net Core Webapi - Fatal编程技术网

C# .Net核心模型将JSON Post绑定到Web API

C# .Net核心模型将JSON Post绑定到Web API,c#,asp.net-core,asp.net-web-api2,model-binding,asp.net-core-webapi,C#,Asp.net Core,Asp.net Web Api2,Model Binding,Asp.net Core Webapi,刚开始一个使用.NETCore的新项目。添加了我的Web API控制器和相关方法。我使用Postman创建了一个JSON对象,并将其发布到我的控制器方法中。请记住,JSON对象与控制器方法中的对象参数完全匹配 在调试模式下,我可以看到对象,它不是空的,属性在那里,但是属性值默认为它们的代表类型,0表示int,等等 我以前从未见过这种行为……所以我采用了完全相同的代码和对象,并在一个带有WebAPI2控制器的MVC项目中进行了复制,它工作得非常完美 我遗漏了什么,我能不能在.NETCore中发布J

刚开始一个使用.NETCore的新项目。添加了我的Web API控制器和相关方法。我使用Postman创建了一个JSON对象,并将其发布到我的控制器方法中。请记住,JSON对象与控制器方法中的对象参数完全匹配

在调试模式下,我可以看到对象,它不是空的,属性在那里,但是属性值默认为它们的代表类型,
0
表示
int
,等等

我以前从未见过这种行为……所以我采用了完全相同的代码和对象,并在一个带有WebAPI2控制器的MVC项目中进行了复制,它工作得非常完美

我遗漏了什么,我能不能在.NETCore中发布JSON和模型绑定

读这篇文章,我似乎不能,除非我发送的形式后,或作为查询字符串变量,顺便说一句,工作良好

JSON:

方法:

[HttpPost]
[Route("test1")]
[AllowAnonymous]
public IActionResult Test(Class1 data)
{
    return Ok();
}

注意:如果您使用的是aspnet core 3.0,可以找到解决方案。对于其他版本,请继续阅读。

您需要使用
FromBody
属性将参数标记为来自body,如下所示:

[HttpPost]
[Route("test1")]
[AllowAnonymous]
public IActionResult Test([FromBody] Class1 data)
{
    return Ok();
}
您需要确保使用
application/json
作为来自Postman的内容类型:

导致:

确保属性设置器也是公共的:

public class Person
{
    public String Name;
    public Int32 Age;
}

我已经为这个问题挣扎了几个小时,现有的解决方案都不适合我,但结果证明我并没有为传入实例的类提供公共的无参数构造函数。在本例中,
Class1
只有受保护的构造函数,并且无论发生什么情况,参数始终为null。希望它能帮助别人。

我也在努力解决这个问题,我想我会分享一个对我来说是必要的项目,而不是在公认的答案中,我需要在我的类中的每个属性中添加{get;set;},如下所示:

    public class LogString{
        public string val {get; set;}
        public string data {get; set;}
    }
其余的都一样:

        [HttpPost]
        public void Post([FromBody] LogString message)
        {      
            Console.WriteLine(message.val);
        }

添加后,它开始工作。

我有一个ASP.Net Core 3.1应用程序,对我来说,这些解决方案都不起作用。在找到文档之前,我丢了几根头发(和几个小时的工作)

简言之:

  • 安装Microsoft.AspNetCore.Mvc.NewtonsoftJsonNuGet软件包
  • 更新项目的Startup.ConfigureServices方法以调用AddNewtonsoftJson。例如:

    public void配置服务(IServiceCollection服务)
    {
    services.AddRazorPages()
    .AddNewtonsoftJson();//这很重要
    }

  • 就这样!我不需要[FromBody]属性


    如果不起作用,请验证模型的属性是否具有setter(例如
    公共字符串消息{get;set;}
    不要忘记setter。

    考虑绑定对象上的属性而不是字段

    在.NET5上,我必须将{get;set;}添加到我的公共字段中,以将它们转换为属性,以便填充它们

    NET 5中的模型绑定器不能处理字段,或者您必须做一些特殊的操作来填充字段。我不知道是哪个。将所有字段转换为属性需要几分钟的时间,所以我不打算花时间试图弄清楚如何将其配置为使用字段


    注意:如果请求对象有此问题,那么响应对象也可能有相同的问题。

    这就是我最初使用它的方式,对象Class1为空。那么它现在可以工作了吗?将编辑答案以澄清标题。@MikeAnderson:假设您有
    [FromBody]
    ,唯一的另一个原因
    数据
    为空是如果发布的名称与
    Class1
    上的属性都不匹配。modelbinder仅在需要实例化类时才会实例化该类(即,该类上至少有一个属性具有值)。感谢您的澄清。我现在明白了。我试图绑定到的对象是EF生成的对象。当我只创建了一个没有EF附加构造函数和虚拟道具的类时,它的工作就像魔术般的lol。所以我想为了在CORE中完成这项工作,我不能使用EF生成的持久模型,我必须创建自己的DTO或VM。无论如何,这是最好的做法…谢谢!感谢您在net core 3.0上的粗体提示。我花了整整一天的时间试图找出问题的症结所在,但在那之前,其他一切都不起作用。这是唯一对我起作用的事情。我在文档中没有看到任何地方说需要使用属性而不是成员变量!这是令人沮丧的。我想补充一点,如果您使用的是core 3.1及以上版本,那么您的转换默认使用System.Text.Json。到目前为止,它只对属性进行序列化/反序列化,因此您的类需要使用属性,而不是像科尔宾回答的那样使用字段。
            [HttpPost]
            public void Post([FromBody] LogString message)
            {      
                Console.WriteLine(message.val);
            }