ASP.Net Core 3 和简单的 POST 控制器

ASP.Net Core 3 and simple POST the controller

我正在尝试 POST 到 ASP.NET 核心 3 服务器。 然而我的 number 总是 0。 ASP.Net Core 3 有什么我看不懂的技巧吗?

参数[FromBody]没有解决问题。 类 作为参数没有帮助,值不会改变。

[HttpPost]
[Route("/api/add")]
public ActionResult<Dictionary<string, object>> Add(int number)
{

    // number is always 0 :(  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

    number += 1;

    var d = new Dictionary<string, object>
    {
        ["message"] = "Hello",
        ["number"] = number 
    };

    return Ok(d);
}
let input = { number: 5825 }

$.ajax(
    {
        url: `/api/add`,
        type: 'POST',
        dataType: "json",
        contentType: "application/json; charset=utf-8",
        data: JSON.stringify(input),
        accepts: "application/json",
        complete: function (output) {
            // completed
        }
    }
);

我的服务是

services.AddSession();
services.AddHttpContextAccessor();
services.AddControllersWithViews();

我用

app.UseSession();
app.UseStaticFiles();
app.UseRouting();
app.UseCors();
app.UseAuthorization();
app.UseEndpoints(endpoints => { endpoints.MapControllerRoute("default", "{controller=Default}/{action=Index}/{id?}"); });

根据显示的客户端代码,该客户端正在发布复杂类型以绑定到服务器上的简单类型。

创建模型

public class Data {
    public int number { get; set; }
}

将模型绑定到动作

[HttpPost]
[Route("/api/add")]
public IActionResult Add([FromBody]Data model) {

    if(ModelState.IsValid) {

        var number = model.number;
        number += 1;

        var d = new {
            message = "Hello",
            number = number 
        };

        return Ok(d);
    }

    return BadRequest(ModelState);
}

在您的 javascript 中,不要发布对象输入,而是尝试直接发布数字变量:

let number=5825;

$.ajax(
    {
        url: `/api/add`,
        type: 'POST',
        dataType: "json",
        contentType: "application/json; charset=utf-8",
        data: number,
        accepts: "application/json",
        complete: function (output) {
            // completed
        }
    }
);

在你的控制器中使用 [FromBody] 注释:

[HttpPost]
[Route("/api/add")]
public ActionResult<Dictionary<string, object>> Add([FromBody]int number)
{

    // number is always 0 :(  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

    number += 1;

    var d = new Dictionary<string, object>
    {
        ["message"] = "Hello",
        ["number"] = number 
    };

    return Ok(d);
}

我同意问题在于您尝试发送复杂类型,而您的操作仅接受简单类型 int。如果您还有问题,请告诉我。

如果您不想创建模型,可以按照@Nkosi 的解决方案将 属性 添加到 model.Or,只需将数字添加到 url 查询,如下所示:

let number = 5825;
    $.ajax(
        {
            url: '/api/add?number=' + number,
            type: 'POST',
            dataType: "json",
            contentType: "application/json; charset=utf-8",
            accepts: "application/json",
            complete: function (output) {
                // completed
            }
        }
    );


[HttpPost]
[Route("/api/add")]

public ActionResult<Dictionary<string, object>> Add(int number)
{
  //...
}