jQuery中$ .getJSON()和$ .ajax()之间的区别
我正在调用ASP.NET MVC操作
public JsonResult GetPatient(string patientID) { ...
从JavaScript使用jQuery。 以下通话起作用
$.getJSON( '/Services/GetPatient', { patientID: "1" }, function(jsonData) { alert(jsonData); });
而这一个没有。
$.ajax({ type: 'POST', url: '/Services/GetPatient', data: { patientID: "1" }, contentType: 'application/json; charset=utf-8', dataType: 'json', success: function(jsonData) { alert(jsonData); }, error: function() { alert('Error loading PatientID=' + id); } });
两者都达到操作方法,但是,$ .ajax调用时,patientID值为空。 我想使用$ .ajax调用一些高级callback。
任何想法赞赏。
内容types
您不需要在调用MVC控制器操作时指定该内容types。 只有在调用ASP.NET AJAX“ScriptServices”和页面方法时,才需要特殊的“application / json; charset = utf-8”content-type。 jQuery的默认contentType“application / x-www-form-urlencoded”适用于请求MVC控制器的操作。
有关此类内容的更多信息,请参见 : JSON劫持和ASP.NET AJAX 1.0如何避免这些攻击
数据
数据是正确的,因为你有它。 通过传递jQuery一个JSON对象,就像在POST数据中那样,它将被序列化为patientID = 1。 这个标准格式是MVC期望的参数。
在使用ASP.NET AJAX服务时,只需将参数括在“{'patientID':1}”中。 他们希望表示一个JSON对象的单个string被parsing出来,而不是POST数据中的单个variables。
JSON
在这个特定的情况下,这不是一个问题,但是养成在JSON对象中引用任何string键或值的习惯是个好主意。 如果您不经意地使用JavaScript保留关键字作为对象中的键或值,而不引用它,则会遇到易混淆的debugging问题。
相反,您不必引用数字或布尔值。 直接在对象中使用它们总是安全的。
所以,假设你想要POST而不是GET,你的$ .ajax()调用可能看起来像这样:
$.ajax({ type: 'POST', url: '/Services/GetPatient', data: { 'patientID' : 1 }, dataType: 'json', success: function(jsonData) { alert(jsonData); }, error: function() { alert('Error loading PatientID=' + id); } });
.getJson只是一个包装.ajax,但它提供了一个更简单的方法签名,因为一些设置是默认的,例如dataType到JSON,types获取等
NB .load,.get和.post也是简单的.ajax方法的包装器。
更换
data: { patientID: "1" },
同
data: "{ 'patientID': '1' }",
进一步阅读: 当在ASP.NET中使用jQuery时要避免3个错误
在jQuery的一些function,如$ .ajax,$ .get,$ .post,$ .getScript,$ .getJSON有什么是最好的,这是最快的使用和下面的时候是这样描述他们,使他们清楚,并摆脱这种types的混乱。
$ .gettJSON()函数是一个简写的Ajax函数(内部使用$ .get()和数据types脚本),相当于下面的expression式,使用一些有限的条件,比如Requesttypes是GET,datatypes是json。
阅读更多.. jquery-post-vs-get-vs-ajax
我看到的唯一区别是,getJSON执行GET请求,而不是POST。
contentType: 'application/json; charset=utf-8'
不好。 至less它不适合我。 其他语法是好的。 您提供的参数格式正确。
与$ .getJSON())没有任何错误callback只有你可以跟踪成功的callback,并没有支持像beforeSend,statusCode,mimeType等标准设置,如果你想使用$ .ajax()。