我有以下JS代码:
const data = await fetch("/api/database/sample",
{
method: "post",
headers: { "Content-Type": "application/json; charset=UTF-8" },
body: JSON.stringify({ names: ['ahmad', 'mutawa'], age: 22 })
});
此代码成功触发 Mvc 控制器中的以下方法(在 .net core 8 应用程序中):
[Route("api/[controller]")]
public class DatabaseController: Controller
{
[HttpPost("sample")]
public IActionResult Sample(string[] names, int age)
{
// names = [] // why ????
// age = 0
return Json(/* some object array */);
}
}
唯一的问题是,参数
names
和 age
设置为默认“空或 nullfor names, and
0for
age”。
我将
Content-Type
更改为 urlencoded-form
,这使我能够成功设置年龄,但 names
数组被视为单个字符串变量,这意味着数组中的所有值都会插入到第一个元素中。
如何解决这个问题?
如果您不想使用 dto 绑定数据,您可以更改后端代码,如下所示来解决问题。
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json.Linq;
namespace WebApplication9.Controllers
{
[ApiController]
[Route("[controller]")]
public class DatabaseController : ControllerBase
{
[HttpPost("sample")]
public IActionResult Sample(Dictionary<string, object> payload)
{
// names = [] // why ????
// age = 0
var names = payload["names"] as JArray;
var age = Convert.ToInt32(payload["age"]);
return Ok(new { names, age });
}
}
}
推荐解决方案
使用FromBody属性绑定数据。
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json.Linq;
namespace WebApplication9.Controllers
{
[ApiController]
[Route("[controller]")]
public class DatabaseController : ControllerBase
{
[HttpPost("sample")]
public IActionResult Sample([FromBody] SampleRequest request)
{
var names = request.Names;
var age = request.Age;
return Ok(names);
}
public class SampleRequest
{
public string[] Names { get; set; }
public int Age { get; set; }
}
}
}