jquery ajax'post'调用

Posted

技术标签:

【中文标题】jquery ajax\'post\'调用【英文标题】:jquery ajax 'post' calljquery ajax'post'调用 【发布时间】:2011-11-06 03:05:20 【问题描述】:

我是 jQuery 和 Ajax 的新手,并且在使用“帖子”时遇到了问题。

我正在使用 jQuery Ajax 'post' 调用将数据保存到数据库。当我尝试保存数据时,它会将 null 传递给我的 C# 方法。 jQuery 看起来像这样:

function saveInfo(id) 
        var userID = id; 
        var userEmail = $('.userEmail').val();
        var userName  = $('.userName').val();

        var dataJSON = "userID": userID, "userEmail": userEmail, "userName": userName;

            $.ajax(
                type: 'POST',
                url: '../../Services/AjaxServices.svc/SaveUser',
                data:JSON.stringify(dataJSON),
                contentType: 'application/json; charset=utf-8',
                dataType: 'json'
            );
        return false;
    `

.userEmail 和 .userName 是对输入字段的类引用。 C# 代码如下所示:

[ServiceContract(Namespace = "http://testUsePage.com")]
[AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Allowed)]                                                                        

public class AjaxServices

    [OperationContract]
    [WebInvoke(Method = "POST", BodyStyle=WebMessageBodyStyle.WrappedRequest, ResponseFormat           = WebMessageFormat.Json)]
    public void SaveUser(User user)
    
        //code here handles save
    

我在“SaveUser”方法中设置了一个断点,并且传递的用户对象始终为空。谢谢!

编辑:我在 ajax 调用和 WebInvoke 属性中都将“POST”切换为“GET”。将一个参数( "UserID": UserID )传递给带有签名( public void SaveUser(string UserID) )的方法到达断点,并且毫无例外地传递 UserID。将其切换回帖子会立即导致内部服务器错误。

【问题讨论】:

【参考方案1】:

您应该以这种方式发送您的用户数据:

用户 : 用户 ID : 1, ...

因为您使用的是wrappedrequest。 json 中的第一个元素应该是参数名。

您的其余代码似乎没问题。你应该使用 stringify。

【讨论】:

【参考方案2】:

你不需要为这么小的东西使用 json。试试这个

function saveInfo(id) 
    var userID = id; 
    var userEmail = $('.userEmail').val();
    var userName  = $('.userName').val();
        $.ajax(type: 'POST',
            url: '../../Services/AjaxServices.svc/SaveUser/?userID='+userID+"&userEmail="+userEmail+"&userName="+userName,
        );
    return false;

【讨论】:

我应该在最初的帖子中提到,指定的元素只是为了简洁。我的实际对象有 52 个参数。【参考方案3】:

您没有将 WebInvoke 属性的 RequestFormat 属性设置为 json。

同样在 $.ajax 调用中发送数据:dataJSON 没有 JSON.stringify 调用。

如果失败,请尝试以下操作,这将发布表单编码信息(默认)而不是 json。 客户端

$.post('../../Services/AjaxServices.svc/SaveUser',
 "userId": userID, "userEmail": userEmail, "userName": userName
);

服务器端

[WebInvoke(Method = "POST", UriTemplate = "SaveUser?userId=userId&userEmail=userEmail&userName=userName")]
public void SaveUser(string userId, string userEmail, string userName)

【讨论】:

我更新了 RequestFormat 属性并删除了 stringify;但是,然后我收到了一个内部服务器错误,甚至没有将其放入 save 方法中。 好的,我还将更改 SaveUser 的 sig 以包含字符串参数开头,将 User 用户作为参数意味着您无法控制转换,并且会在断点之前崩溃。 好的,我已经更改了我的方法签名以单独预测 52 个参数。我还在 ajax 调用之前添加了一个“警报”,以显示我的对象在调用之前的样子。警报,“警报(JSON.stringify(dataJSON));”返回预期的 "UserID": userID...etc 我的方法现在预期参数(Guid userID,字符串 userEmail...等) 不过,在到达方法内部的断点之前,我遇到了内部服务器错误。 您是否有任何其他由 ajax 调用的服务端方法,或者仅此一个?,http 500 仍然显示它到达您的服务器 我有一个 'GET' 用于检索用户信息。它工作得很好,事实上,我在某一时刻改变了我的“POST”方法,并把它变成了 GET,看看它是否能工作,只传递一个参数。它确实像 GET 一样工作,所以我认为问题出在 POST 上,尽管我不知道它可能是什么。【参考方案4】:

您是否尝试过在 Firefox 的 Firebug 中打开“网络”选项卡并分析您的调用以查看发布到 Web 服务的实际数据是什么?试试看,如果里面的数据是空的,那么你就知道你的 javascript 有问题,然后尝试调试你的 Javascript。

但问题可能是您的 Web 服务方法签名需要一个 User 对象作为参数,但您传递的是一堆文字参数。您可以将您的方法签名更改为这样的东西,它可能会起作用:

public void SaveUser(string userID, string userEmail, string userName)

我读过你的 cmets,试试这个:

客户端脚本中的 JSON 对象没有字符串化

public class AjaxServices

    [OperationContract]
    [WebInvoke(Method = "POST", BodyStyle=WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
    public void SaveUser(string userID, string userEmail, string userName)
    
        //code here handles save
    

【讨论】:

我之前曾尝试将签名设置为只需要一个用户 ID,并且只通过 Ajax 调用传递 ID。但是,这导致了内部服务器错误,并且我的代码从未到达 save 方法中的断点。 @wblanks 尝试将您的 web-service 方法属性 BodyStyle=WebMessageBodyStyle.WrappedRequest 更改为 BodyStyle=WebMessageBodyStyle.Bare ,如上所述删除 stringify 并接受我上面显示的几个字符串参数以开始并保留 @添加了 987654325@ 属性 @wblanks 对于初学者,使用 52 个参数复制您当前的 Web 服务调用并注释掉原来的。在复制的版本中,只需传递 1 个参数进行测试,使其成为 string userID ,然后测试尝试仅从客户端发布 1 个参数。看看这是否有效,如果有效,您的 52 个参数之一可能有问题,这将需要额外的调试,但可能会为您指明正确的方向。 @wblanks 换句话说,首先使用 1 个参数(字符串类型参数)对服务调用进行非常简单的测试,一旦你得到这个工作,你可以扩展你的调用以接受其余的您需要的参数。 我将格式为 "UserID": UserID 的一个参数发送到带有签名(Guid UserID)的方法。它在到达方法内部的断点之前返回了一个内部服务器错误。【参考方案5】:

简单地说:$.ajax()data 属性是数据的映射(对象)而不是数据字符串。在发送对象之前不要对它进行字符串化:

var dataJSON = "userID": userID, "userEmail": userEmail, "userName": userName;

$.ajax(
    type: 'POST',
    url: '../../Services/AjaxServices.svc/SaveUser',
    data: dataJSON,
    contentType: 'application/json; charset=utf-8',
    dataType: 'json'
);

【讨论】:

以上是关于jquery ajax'post'调用的主要内容,如果未能解决你的问题,请参考以下文章

如何调用jquery插件的方法

怎么调用jQuery

jquery调用接口,保存数据

在另一个 jquery 函数中调用 jquery 插件

jquery函数里面怎样调用一个函数里面的函数

怎样用jquery调用外部html