我正在调用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); } });
两者都达到了action方法,但是对于$ .ajax调用,patientID值为null.我想使用$ .ajax调用来进行一些高级回调.
任何想法都赞赏.
内容类型
您无需在调用MVC控制器操作时指定该内容类型.只有在调用ASP.NET AJAX"ScriptServices"和页面方法时才需要特殊的"application/json; charset = utf-8"内容类型.jQuery的默认contentType"application/x-www-form-urlencoded"适用于请求MVC控制器操作.
有关该内容类型的更多信息,请参阅: JSON Hijacking以及ASP.NET AJAX 1.0如何避免这些攻击
数据
你拥有的数据是正确的.通过传递jQuery一个JSON对象,它将在POST数据中被序列化为patientID = 1.这个标准形式是MVC对参数的期望.
当您使用ASP.NET AJAX服务时,您只需将参数括在引号中,如"{'patientID':1}".他们希望解析出代表JSON对象的单个字符串,而不是POST数据中的各个变量.
JSON
在这种特定情况下,这不是问题,但是养成在JSON对象中引用任何字符串键或值的习惯是个好主意.如果您无意中使用JavaScript保留关键字作为对象中的键或值,而不引用它,则会遇到令人困惑的调试问题.
相反,您不必引用数值或布尔值.直接在对象中使用它们总是安全的.
因此,假设您确实想要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,类型得到等等
NB .load,.get和.post也是围绕.ajax方法的简单包装器.
更换
data: { patientID: "1" },
同
data: "{ 'patientID': '1' }",
进一步阅读:在ASP.NET中使用jQuery时要避免3个错误
在jquery的一些函数中存在很多混淆,比如$ .ajax,$.get,$ .post,$ .getScript,$ .getJSON,它们之间的区别是哪个是最好的,哪个是快的,哪个是使用时,以下是对它们的描述,使它们清楚,并摆脱这种类型的混淆.
$ .gettJSON()函数是一个简写的Ajax函数(内部使用带有数据类型脚本的$ .get()),它相当于下面的表达式,使用一些有限的条件,比如Request类型是GET,数据类型是json.
阅读更多.. jquery-post-vs-get-vs-ajax