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'调用的主要内容,如果未能解决你的问题,请参考以下文章