AJAX POST 请求未将数据传递给 ASP.NET Core 2.2 中的控制器方法

dra*_*tar 3 c# ajax post kendo-grid asp.net-core

在开始之前,我想说 - 我意识到这个问题与本网站上发布和回答的许多其他问题非常相似。我已经通读并尝试了尽可能多的与我的问题相关的解决方案,但到目前为止没有一个奏效。

我试图将数据从我的网页传递到控制器方法。网页非常简单,只需要抓取用户输入的信息并发送出去即可。我正在使用 Telerik 的 Kendo Grid 来绑定和组织我的数据。但是,无论我尝试什么,我的 AJAX 发布请求都不会正确地向前传递参数。使用浏览器的调试器时,我可以看到传递给 AJAX 请求的参数是有效的,但是当它们在控制器方法中遇到我的断点时,它们都为空或默认值。

包含 AJAX 请求的函数

function saveShiftDataToServer() {
    var grid = $("#myGrid").data("kendoGrid");
    var dataSource = grid.dataSource;
    var allData = dataSource.data();
    var comments = '@Model.Comments';
    var loadInfoCorrect = '@Model.LoadInfoCorrect';

    $.ajax({
        type: "POST",
        url: '/Home/SaveData',
        data: JSON.stringify({ accessorials: allData, comments: comments, loadInfoCorrect: loadInfoCorrect }),
        contentType: "application/json; charset=utf-8",
        datatype: "json"
    })
}
Run Code Online (Sandbox Code Playgroud)

控制器方法

[AcceptVerbs("Post")]
public ActionResult SaveData(Accessorial[] accessorials, string comments, bool loadInfoCorrect)
{
    // Code removed for brevity
}
Run Code Online (Sandbox Code Playgroud)

我的 Kendo Grid 类型为 Accessorial(第一个控制器方法参数类型),所以我的假设是检索所有当前行的集合应该返回该模型的数组。即便如此,“comments”也是一个字符串,但只会作为空值传递给控制器​​方法。

我是 ASP.NET Core 和 Kendo 的新手,所以我确信我遗漏了一些明显的东西。任何帮助,将不胜感激!

dra*_*tar 6

我感谢所有的回应!通过将 AJAX 数据类型更改为“文本”并直接将 JSON 传递给反序列化服务器端,我终于能够在我的控制器中看到有效数据。出于某种原因,这是迄今为止我能够完成这项工作的唯一方法。

AJAX POST 调用

function saveShiftDataToServer() {
    var grid = $("#accessorialGrid").data("kendoGrid");
    var dataSource = grid.dataSource;
    var allData = dataSource.data();

    var shiftOverview = {
        ShiftId: 0,
        UserName: "test",
        ShiftDate: null,
        LoadList: null,
        AccessorialList: allData,
        LoadInfoCorrect: true,
        Comments: ""
    };        
    var jsonData = JSON.stringify(shiftOverview);

    $.ajax({
        type: "POST",
        url: '/Home/SaveData',
        data: { json: jsonData },
        datatype: "text",
        success: function (response) {
                alert("111");
            }
        })
}
Run Code Online (Sandbox Code Playgroud)

控制器方法

[AcceptVerbs("Post")]
public ActionResult SaveData(string json)
{
    JsonConvert.DeserializeObject<ShiftOverview>(json); // This produces an object with valid data!
}
Run Code Online (Sandbox Code Playgroud)