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

时间:2017-07-26 17:22:54

标签: c# json ajax 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; }
}

控制器

[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);
}

查看

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(":(");
        }
    });
}

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

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

我是ASP.NET Core的新手,我甚至不知道谷歌的内容,而且帖子的每个变体都不适合我。如何使用我的模型,通过ajax从我的视图中获取数据到控制器?每个人似乎都采用不同的方式。

2 个答案:

答案 0 :(得分:3)

由于您是通过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);
}

简而言之,您需要指定contetType标头,以便服务器知道它接收的类型以及如何处理它。将“application / json”指定为ajax调用中的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');
    }
});

答案 1 :(得分:1)

我看到你在post函数中将 模型 作为 参数 。如果您不提供,则 null

理想情况下,您不需要在网址中/Test/Edit,因为它们已经在正文中。

以下是我测试的方法 -

<button type="button" onclick="post();">Post Data</button>
<script>
    var model = {
        text: "Test_text",
        type: "test",
        name: "test_name"
    }

    function post() {
        var url = '/Utilities/Tool';
        $.ajax({
            url: url,
            data: JSON.stringify(model),
            type: 'POST',
            contentType: "application/json",
            success: function() {
                alert("all good");
            },
            error: function() {
                alert(":(");
            }
        });
    }
</script>

[HttpPost("/Utilities/Tool")]
public IActionResult ToolProcess([FromBody]ToolModel model)
{
    model.text += "Return From Server";
    return Ok(model);
}

enter image description here