如何将 post 参数从 JS 传递到 MVC 控制器?

问题描述 投票:0回答:1

我有以下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 })

});

Developers tools

此代码成功触发 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
设置为默认“空或 null
for names, and
0
for
age”。

missing values for the parameters

我将

Content-Type
更改为
urlencoded-form
,这使我能够成功设置年龄,但
names
数组被视为单个字符串变量,这意味着数组中的所有值都会插入到第一个元素中。

如何解决这个问题?

asp.net-core post model-view-controller fetch-api
1个回答
0
投票

如果您不想使用 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 });

        }
     }
}

enter image description here

推荐解决方案

使用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; }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.