C# ASP.NET Core-使用[HttpPost]发布请求不适用于对象

C# ASP.NET Core-使用[HttpPost]发布请求不适用于对象,c#,asp.net-core-webapi,C#,Asp.net Core Webapi,我试图做一个简单的POST请求,但似乎[FromBody]无法理解超过2个参数 请求: [HttpPost] public IEnumerable<EnergyMarket> addEnergy([FromBody] EnergyMarket energyMarket) { _energyMarketService.addEnergy(energyMarket.Name, energyMarket.StockIPO, energyMarket.EnergyPrice)

我试图做一个简单的POST请求,但似乎
[FromBody]
无法理解超过2个参数

请求:

 [HttpPost]
 public IEnumerable<EnergyMarket> addEnergy([FromBody] EnergyMarket energyMarket)
 {
     _energyMarketService.addEnergy(energyMarket.Name, energyMarket.StockIPO, energyMarket.EnergyPrice);
     return _energyMarketService.Energies;
 }
请求(内容类型为application/json)


当我转到POSTMAN并提出以下请求时,它对前两个参数运行良好,但
价格始终为0。当我将价格从double更改为string时,字符串始终为null。

默认ASP.NET核心模型绑定器不使用Newtonsoft.Json属性。因此,我们应该自己实施

首先,创建
IModelBinder
的实现,该实现将读取请求体,并使用Newtonsoft
JsonConvert.DeserializeObject
方法对其进行反序列化

public class NewtonsoftModelBinder : IModelBinder
{
    public async Task BindModelAsync(ModelBindingContext bindingContext)
    {

        string valueFromBody = string.Empty;
        using (var sr = new StreamReader(bindingContext.HttpContext.Request.Body))
        {
            valueFromBody = await sr.ReadToEndAsync();
        }

        if (string.IsNullOrEmpty(valueFromBody))
        {
            return;
        }

        try
        {
            var model = JsonConvert.DeserializeObject(valueFromBody, bindingContext.ModelType);

            bindingContext.Result = ModelBindingResult.Success(model);
        }
        catch
        {
            bindingContext.ModelState.TryAddModelError(
                "", "Model can not be deserialized.");

        }

        return;
    }
}
然后有多种方法可以将其应用到代码中,但最简单的方法是将其作为
EnergyMarket
类的属性

[ModelBinder(BinderType = typeof(NewtonsoftModelBinder))]
public class EnergyMarket
{
    [JsonProperty("name")]
    public string Name { get; set; }
    [JsonProperty("stockipo")]
    public string StockIPO { get; set; }
    [JsonProperty("price")]
    public double EnergyPrice { get; set; }

    public EnergyMarket() { }

    public EnergyMarket(string name, string stockIPO, double val)
    {
        this.Name = name;
        this.StockIPO = stockIPO;
        this.EnergyPrice = val;
    }
}
最后,在邮递员请求后,我们可以在控制器中看到正确的数据


默认ASP.NET核心模型绑定器不使用Newtonsoft.Json属性。因此,我们应该自己实施

首先,创建
IModelBinder
的实现,该实现将读取请求体,并使用Newtonsoft
JsonConvert.DeserializeObject
方法对其进行反序列化

public class NewtonsoftModelBinder : IModelBinder
{
    public async Task BindModelAsync(ModelBindingContext bindingContext)
    {

        string valueFromBody = string.Empty;
        using (var sr = new StreamReader(bindingContext.HttpContext.Request.Body))
        {
            valueFromBody = await sr.ReadToEndAsync();
        }

        if (string.IsNullOrEmpty(valueFromBody))
        {
            return;
        }

        try
        {
            var model = JsonConvert.DeserializeObject(valueFromBody, bindingContext.ModelType);

            bindingContext.Result = ModelBindingResult.Success(model);
        }
        catch
        {
            bindingContext.ModelState.TryAddModelError(
                "", "Model can not be deserialized.");

        }

        return;
    }
}
然后有多种方法可以将其应用到代码中,但最简单的方法是将其作为
EnergyMarket
类的属性

[ModelBinder(BinderType = typeof(NewtonsoftModelBinder))]
public class EnergyMarket
{
    [JsonProperty("name")]
    public string Name { get; set; }
    [JsonProperty("stockipo")]
    public string StockIPO { get; set; }
    [JsonProperty("price")]
    public double EnergyPrice { get; set; }

    public EnergyMarket() { }

    public EnergyMarket(string name, string stockIPO, double val)
    {
        this.Name = name;
        this.StockIPO = stockIPO;
        this.EnergyPrice = val;
    }
}
最后,在邮递员请求后,我们可以在控制器中看到正确的数据


asp.net核心模型绑定器与newtonsoft json属性无关。这个字段应该叫做
energyPrice
哦,天哪,这是个新手犯的错误!它现在运行良好。谢谢:)@YegorAndrosovI发布了一个解决方案,如何在不更改属性或重命名属性的情况下完成此操作。仅fyiasp.net核心模型绑定器与newtonsoft json属性无关。这个字段应该叫做
energyPrice
哦,天哪,这是个新手犯的错误!它现在运行良好。谢谢:)@YegorAndrosovI发布了一个解决方案,如何在不更改属性或重命名属性的情况下完成此操作。仅供参考