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

AJAX POST Request Not Passing Data to Controller Method in ASP.NET Core 2.2

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

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

函数包含 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"
    })
}

控制器方法

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

我的 Kendo 网格类型为辅助(第一个控制器方法参数类型),所以我的假设是检索所有当前行的集合应该 return 该模型的数组。即便如此,"comments" 是一个字符串,但只会作为 null 传递给控制器​​方法。

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

您正在传递 JSON 对应于 C# 的对象,如下所示:

public class Model {
    public Accessorial[] Accessorials { get; set; }
    public string Comments { get; set; }
    public bool loadInfoCorrect { get; set; }
}

尝试在上面声明这样的 class 并以这种方式调整您的操作方法:

public ActionResult SaveData(Model model)
{
    // Code removed for brevity
}

如果没有帮助 - 创建模型参数 object 并在调试模式下检查您从 AJAX 调用中获得的内容。

您可以在 ViewModel 中传递所有数据并使用 [FromBody] on action

访问它
public class ViewModel
    {
        public List<Accessorial> Accessorials{ get; set; }
        public string Comments { get; set; }
        public bool LoadInfoCorrect { get; set; }
    }

Ajax:

var model = {};//pass all you data to an object
        model.Accessorials = allData ;
        model.comments = comments ;
        model.loadInfoCorrect = loadInfoCorrect;

        var items = JSON.stringify(model);        

        $.ajax({
            url: '/GetAllCustDetails/SaveData',
            type: "POST",
            data: items,
            contentType: 'application/json; charset=utf-8',
            //dataType: "json",
            success: function (response) {
                alert("111");
            }
        });

控制器:

[HttpPost]
public ActionResult SaveData([FromBody]ViewModel model)

感谢所有回复!通过将 AJAX 数据类型更改为 "text" 并直接将 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");
            }
        })
}

控制器方法

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

您只需在操作方法中使用 [FromBody] 属性,如下所示:

[HttpPost]
public ActionResult SaveData([FromBody]Model model)
{
    // Code removed for brevity
}