C# ASP.NET Core-使用[HttpPost]发布请求不适用于对象
我试图做一个简单的POST请求,但似乎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)
[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
的实现,该实现将读取请求体,并使用NewtonsoftJsonConvert.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
的实现,该实现将读取请求体,并使用NewtonsoftJsonConvert.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发布了一个解决方案,如何在不更改属性或重命名属性的情况下完成此操作。仅供参考