我有一个功能完美的应用程序,内置于 Angular 13 和 dotNet core 2.1。现在我正在将其从 dotNet core 2.1 升级到 dotNet 8.0。我已成功升级所有其他功能,但仍停留在以 JObject 形式接收参数。
在旧版本中,我从前端以 json 形式传递参数,例如
"{"query":"dotNet"}"
。
后端控制器动作结构如下。
[HttpPost]
public async Task<IActionResult> GetDataAsync([FromBody] JObject jSearchItems)
{
try
{
dynamic SearchItems = jSearchItems;
string query = SearchItems.query;
ServiceResponse response = await _Service.GetDataAsync(query);
return StatusCode((int)(response.IsValid ? HttpStatusCode.OK : HttpStatusCode.BadRequest), response);
}
catch (Exception ex)
{
return StatusCode((int)HttpStatusCode.InternalServerError, ex.Message);
}
}
注意函数参数的类型是
JObject
。
在 dotNet core 2.1 中它工作正常,但是当我将其升级到 dotNet 8.0 时,控制器中接收到的数据为 null。如果我为参数创建一个新模型如下
class SearchItem
{
public string query { get; set; }
}
将参数类型从
JObject
更改为SearchItem
即可正确接收数据。
但是我不想创建数百个类,因为这个应用程序中有很多 api。
那么如何在 ASP.NET dotNET 8.0 控制器中以 JObject 形式接收来自 post 请求的 Json 参数?
试试这个:
首先安装nuget包Microsoft.AspNetCore.Mvc.NewtonsoftJson 然后在program.cs中添加:
builder.Services.AddControllers().AddNewtonsoftJson();
从 ASP.NET Core 3.0 及更高版本中,使用的默认 JSON 序列化器是
System.Text.Json
,与早期版本中使用的 Newtonsoft.Json
库相比,其行为可能有所不同。在您的情况下,当接收 JSON 负载作为 JObject
时,System.Text.Json
可能不会像 JObject
那样自动将请求正文绑定到 Newtonsoft.Json
对象。
但是,您仍然可以通过将请求正文作为字符串读取,然后手动将其解析为
JObject
来实现类似的行为。具体方法如下:
例如:
[HttpPost]
public async Task<IActionResult> GetDataAsync()
{
try
{
// Read the request body as a string
using (StreamReader reader = new StreamReader(Request.Body, Encoding.UTF8))
{
string requestBody = await reader.ReadToEndAsync();
JObject jSearchItems = JObject.Parse(requestBody);
string query = (string)jSearchItems["query"];
// ServiceResponse response = await _Service.GetDataAsync(query);
return Ok(new { query });
}
}
catch (Exception ex)
{
return StatusCode(500, ex.Message);
}
}
此方法允许您在 ASP.NET Core 3.0 及更高版本中以
JSON
形式接收 JObject
参数,而无需为每个 API 端点显式定义模型类。