如何使用AJAX和JQuery实现一个带有JSON数据的PUT调用?

18

我查看了很多不同的方法,但似乎无法将实际数据传递给我的控制器函数。

以下是一些代码:

        var URL = "/Timesheet/Timesheet/UpdateEntry";

        var dataObject = { 'newWeekEntry': newEntry, 'oldWeekEntry': oldEntry };

        alert(JSON.stringify(dataObject));

        $.ajax({
            url: URL,
            type: 'PUT',    
            data: JSON.stringify(dataObject),
            dataType: 'json',
            success: function(result) {
                alert("success?");
            }
        });

newEntryoldEntry都是对象。

alert语句输出如下内容(为了简洁起见,省略了一些属性):

{"newWeekEntry":{"MondayHours":2,"TuesdayHours":2,"WednesdayHours":5,"ThursdayHours":5,"FridayHours":"4","SaturdayHours":0,"SundayHours":0},"oldWeekEntry":{"MondayHours":2,"TuesdayHours":2,"WednesdayHours":5,"ThursdayHours":5,"FridayHours":2,"SaturdayHours":0,"SundayHours":0}}

当我调试我的控制器操作("UpdateEntry")时,这两个参数都填充了TimesheetEntry类的默认参数(0)。

我是否正确地传递了它们?


当你说“当我调试我的控制器操作('UpdateEntry')时,这两个参数填充了TimesheetEntry类的默认参数(0)”时,你能详细说明一下吗?你在服务器上使用的是什么(例如Rails),以及你如何将JSON转换为TimesheetEntry? - InPursuit
2
dataType 属性仅在从服务器获取数据时使用。当向服务器发送数据时,应将 contentType 设置为 application/json - InPursuit
谢谢 InPursuit!问题已解决。您是否想将此作为答案添加,我可以接受它? - D'Arcy Rail-Ip
3个回答

40

dataType 属性仅在从服务器获取数据时使用。当向服务器发送数据时,应将 contentType 设置为 application/json


6
$.ajax({
        url: window.serverUrl + 'student/event/' + eventId,
        type: 'put',
        data: JSON.stringify(data),
        headers: {
            'x-auth-token': localStorage.accessToken,
            "Content-Type": "application/json"
        },
        dataType: 'json'
})

这对我有用。

4

使用头部:{"X-HTTP-Method-Override": "PUT"}覆盖POST请求类型。在我的项目中有效...

$.ajax({
    type: 'POST', // Use POST with X-HTTP-Method-Override or a straight PUT if appropriate.
    dataType: 'json', // Set datatype - affects Accept header
    url: "http://example.com/people/1", // A valid URL
    headers: {"X-HTTP-Method-Override": "PUT"}, // X-HTTP-Method-Override set to PUT.
    data: '{"name": "Dave"}' // Some data e.g. Valid JSON as a string
});

为什么要使用“POST”作为类型,但在标头中覆盖它? - Mese
查看一下,你会发现将put作为类型使用时并不像应该的那样工作。 - LifeInstructor
如何在您的控制器中获取它? - famas23
这仅适用于那些理解该标头的服务器,作为缺乏“PUT”或“DELETE”方法支持的解决方法。这太糟糕了。 - Joseph Van Riper
抱歉,我应该说这很糟糕,因为它会引入安全问题。如果您可以合法且正确地进行PUT请求,请这么做。 - Joseph Van Riper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接