【问题标题】:AJAX Post call no dataAJAX Post 调用无数据
【发布时间】:2021-10-21 10:11:07
【问题描述】:

你好,wenn 我想向我的控制器发送一个发布请求,但没有数据。 我试图记录我的 Json 文件并且有一些东西。但是当我发送发布请求时,我的控制器显示它是空的。

这是我的电话:

var item = {};
        var jsonObj = [];

        item["ProductCategoryId"] = i;
        item["Name"] = txtName;
        item["Description"] = txtDescription;
        item["Price"] = txtPrice;
        item["Stock"] = txtStock;
        item["ProductCategory"] = txtProductCategory;
        item["Image"] = await getAsByteArray(txtImage);
        jsonObj.push(item);

        var jsonString = JSON.stringify(jsonObj);
        console.log("jsonString : " + jsonString);

        $.ajax({
            url: "/Admin/SaveProductToDB",
            type: "POST",
            data: { dataToSend: jsonString},
            success: function (data) {
                if (data.status == "Success") {
                    BootstrapDialog.show({
                        title: 'Success!',
                        message: "Data Updated Successfully!",
                        buttons: [{
                            label: 'OK',
                            action: function (dialog) {
                                window.location.href = "/Admin/Product";
                                removeProdData(i);
                                $("#btnAddProd").attr("disabled",false);
                                dialog.close();
                            }
                        }]
                    });
                }

            }
        });

    //Here I make a breakpoint but my string is empty
        public JsonResult SaveProductToDB(string dataToSend)
    {
         List<Product> _List = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Product>>(dataToSend);
    }

getAsByteArray

async function getAsByteArray(file) {
    return new Uint8Array(await readFile(file))
}

function readFile(file) {
    return new Promise((resolve, reject) => {
        // Create file reader
        let reader = new FileReader()

        // Register event listeners
        reader.addEventListener("loadend", e => resolve(e.target.result))
        reader.addEventListener("error", reject)

        // Read file
        reader.readAsArrayBuffer(file)
    })
}

我发现我是否删除了图像。然后控制器可以调整它的大小。感谢你目前的帮助。所以我需要看看这个问题所在的地方。

【问题讨论】:

  • 前端代码看起来不错(假设jsonString不为空),我猜问题出在后端
  • when I send the post request my controller shows it is empty - 你是怎么测试这个的?请添加相关控制器代码。还要在网络选项卡中验证请求是否发送成功,您甚至可以在该选项卡中看到正在发送的数据
  • /Admin/Product 路径是相对的吗? (如/Admin/与此JS文件在同一文件夹中)
  • 控制器被调用,但控制器端的 dataToString 为空。在前端我看到 jsonString 不是空的。

标签: javascript ajax


【解决方案1】:

您正在检查data.status,就好像它存在一样。只需console.log(data),您就会看到状态是否正在返回。

此外,如果您在 Chrome 中打开“网络”选项卡,您可以点击发布请求并查看您的标头是否准确通过,还可以点击“预览”以查看来自控制器的未过滤结果。

您可能希望修改代码以捕获错误以进行调试,即:

     $.ajax({
            url: "/Admin/SaveProductToDB",
            type: "POST",
            data: { dataToSend: jsonString},
            success: function (data) {
                if (data.status == "Success") {
                    BootstrapDialog.show({
                        title: 'Success!',
                        message: "Data Updated Successfully!",
                        buttons: [{
                            label: 'OK',
                            action: function (dialog) {
                                window.location.href = "/Admin/Product";
                                removeProdData(i);
                                $("#btnAddProd").attr("disabled",false);
                                dialog.close();
                            }
                        }]
                    });
                }
            },
            error:function (xhr, ajaxOptions, thrownError) {
                // Set up whatever error reaction you want, here. ie:
                console.log('An error was encountered.');
                alert(xhr.status);
                alert(thrownError);
            }
        });

另一个技巧是在 Ajax 调用之前验证提交的空数据,因此您只在数据有效时才接触后端服务器 - 以避免错误。

【讨论】:

  • 我检查了一下,我的标题中的字符串是正确的。
  • 假设您使用的是 Chrome,您是否在“标题”旁边的“预览/响应”选项卡中看到任何内容。在“标题”选项卡内,您是否看到指示绿色图标的状态代码、20X 代码?
  • 我看到 500 内部服务器错误,但这是来自控制器中的 Newtonsoft,因为该值为空。
  • @GonzoGonzales 更新了我的答案,希望能提供帮助
  • 在这里我找到了我的问题的解决方案。 stackoverflow.com/questions/46549746/…
猜你喜欢
  • 2014-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-21
  • 2012-01-04
  • 2016-05-31
相关资源
最近更新 更多