在 ASP.NET Core 中使用 JSON 将模型发布到控制器

Sun*_*den 0 c# ajax json asp.net-core

我是 ASP.NET Core 的新手,我正在尝试将视图模型发布到我的控制器(我认为)。

模型:

public class ToolModel
{
    public ToolModel() { }
    public string text { get; set; }
    public string type { get; set; }
    public string name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

控制器

[HttpPost("/Utilities/Tool/{type}/{process}")]
public IActionResult ToolProcess(ToolModel model, string type, string process)
{
    var test = model.text;
    var result = new Services.ToolServices().exec(model, type, process);
    return Ok(result);
}
Run Code Online (Sandbox Code Playgroud)

看法

var model = {
    text: "Test_text",
    type: "test",
    name: "test_name"
}

function post(model) {
    var url = '/Utilities/Tool/Test/Edit';
    $.ajax({
        url: url,
        data: JSON.stringify(model),
        type: 'POST',
        success: function () {
            alert("all good");
        },
        error: function () {
            alert(":(");
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

我目前能够在我的控制器中到达一个断点,但模型值为空。我尝试了这个过程的各种组合,包括将 [FromBody] 添加到控制器参数中。当我添加 [FromBody] 时,我根本没有到达我的断点,请求失败了,我收到错误:“找不到元素”。

起初我尝试将我的 ToolModel 模型传递给我的索引控制器中的视图,但我无法弄清楚如何将数据从我的视图连接到模型(我尝试设置@Model.text = "test"没有成功)。那没有用,所以我只是将模型复制为一个 javascript 对象。根据我所阅读的内容,当我发布 json 时,它应该会自动绑定到我的模型吗?

我对 ASP.NET Core 太陌生了,我什至不知道要谷歌什么,而且帖子的每个变体对我来说都失败了。如何使用我的模型通过 ajax 从我的视图中获取数据到我的控制器?每个人的做法似乎都不一样。

Shy*_*yju 5

由于您通过 POST 请求发送数据,因此数据将在请求正文中发送。因此,您应该指示 MVC 框架从请求正文中读取它。您可以使用[FromBody]属性装饰您的参数来做到这一点。

此外,删除type参数,因为您的 ToolModel 类具有同名的属性。您也可以从属性路由定义中删除它。

[HttpPost("/Utilities/Tool/{process}")]
public IActionResult ToolProcess([FromBody] ToolModel model,  string process)
{
    var test = model.text;
    var result = model;
    // to do : Add your custom code here
    return Ok(result);
}
Run Code Online (Sandbox Code Playgroud)

在客户端,您需要指定 contetType 标头,以便服务器知道它接收的类型以及如何处理它。在 ajax 调用中指定“application/json”作为 contentType 值。

var url = '/Utilities/Tool/Edit';
$.ajax({
    url: url,
    data: JSON.stringify(model),
    contentType:"application/json",
    type: 'POST',
    success: function (r) {
        alert("all good");
        console.log(JSON.stringify(r));
    },
    error: function () {
        console.log('errr');
    }
});
Run Code Online (Sandbox Code Playgroud)