jQuery Ajax "Post"调用

5

我是jQuery和Ajax的新手,使用'post'时遇到了问题。

我正在使用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”方法内设置了一个断点,传递的User对象始终为空。谢谢!
编辑:我将ajax调用和WebInvoke属性中的“POST”切换为“GET”。向具有签名(public void SaveUser(string UserID))的方法传递一个参数({"UserID": UserID}),可以到达断点,并且不会出现异常传递UserID。立即将其切换回POST会导致内部服务器错误。
5个回答

5
你应该以这种方式发送用户数据:
{ user : { userID : 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;
}

3
我应该在最初的帖子中提到,指定的元素仅用于简洁起见。我的实际对象包含52个参数。 - wblanks

2

您没有将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;然后,我收到了一个内部服务器错误,甚至无法进入保存方法。 - wblanks
好的,我也会更改SaveUser的签名以首先包含字符串参数。将User用户作为参数意味着您无法控制转换并且会在断点之前崩溃。 - James Kyburz
我有一个“GET”方法,用于检索用户信息。它完美地工作着,事实上,我曾经改变过我的“POST”方法,并将其改为GET,以查看它是否能够工作,只传递了一个参数。它确实作为GET工作,因此我认为问题特别出现在POST上,尽管我不知道可能是什么问题。 - wblanks
如果省略processData参数会发生什么? - James Kyburz
没有效果,虽然我认为这是多余的,因为默认设置为true。无论哪种情况,它都被省略了,但我仍然返回内部服务器错误。 - wblanks
显示剩余2条评论

0

你尝试过在Firefox的Firebug中打开Net选项卡并对调用进行分析,以查看实际发布到Web服务的数据吗?如果其中的数据为空,则说明您的Javascript存在问题,请尝试调试您的Javascript。

但问题可能是您的Web服务方法签名期望将User对象作为参数,但您正在传递一堆文字参数。您可以更改方法签名,例如:

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

我看到了你的评论,试试这个:

在客户端脚本中不要对你的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
    }
}

我之前尝试过将签名设置为只接受userID,并且只通过Ajax调用传递了id。然而,这导致了内部服务器错误,我的代码从未达到保存方法内的断点。 - wblanks
@wblanks 请尝试更改您的Web服务方法属性BodyStyle=WebMessageBodyStyle.WrappedRequestBodyStyle=WebMessageBodyStyle.Bare,根据我展示的示例,将string参数输入几个,请删除上述提到的stringify,并保留添加RequestFormat = WebMessageFormat.Json属性。 - Dmitry Samuylov
@wblanks 首先,复制您当前的具有52个参数的Web服务调用,并注释掉原始内容。在复制的版本中,只传递1个参数进行测试,将其设置为“string userID”,然后尝试仅从客户端提交1个参数进行发布。看看是否有效,如果有效,则可能是您的52个参数之一出了问题,这需要额外的调试,但可能会指向正确的方向。 - Dmitry Samuylov
@wblanks 换句话说,首先使用仅包含一个参数(字符串类型参数)的非常简单的服务调用测试,一旦您使其正常工作,就可以扩展您的调用以接受您需要的其他参数。 - Dmitry Samuylov
我向带有签名 (Guid UserID) 的方法发送了一个参数,格式为 {"UserID": UserID}。在到达方法内部断点之前,它返回了一个内部服务器错误。 - wblanks
@wblanks 不要使用 Guid,而是使用 string 进行测试,复制以下内容 public void SaveUser(string userID) 并查看它是否与一个参数一起工作。 - Dmitry Samuylov

0
简而言之:$.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'
});

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