我正在调用ASP.NET MVC操作
public JsonResult GetPatient(string patientID)
{
...
使用jQuery从JavaScript。以下调用有效
$.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调用来进行一些高级回调。
任何想法都赞赏。
答案 0 :(得分:35)
内容型强>
您无需在调用MVC控制器操作时指定内容类型。只有在调用ASP.NET AJAX“ScriptServices”和页面方法时才需要特殊的“application / json; charset = utf-8”内容类型。 jQuery的默认contentType“application / x-www-form-urlencoded”适用于请求MVC控制器操作。
此处有关于该内容类型的更多信息:JSON Hijacking and How ASP.NET AJAX 1.0 Avoids these Attacks
数据强>
数据 正确无误。通过传递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);
}
});
答案 1 :(得分:19)
.getJson只是.ajax的一个包装器,但它提供了一个更简单的方法签名,因为某些设置是默认的,例如dataType为json,类型为get等
N.B .load,.get和.post也是围绕.ajax方法的简单包装器。
答案 2 :(得分:11)
替换
data: { patientID: "1" },
与
data: "{ 'patientID': '1' }",
答案 3 :(得分:6)
jquery的一些功能有很多混淆,如$ .ajax,$ .get,$ .post,$ .getScript,$ .getJSON,它们之间的区别是哪个最好,哪个是快速,使用哪些以及何时使用它们是为了使它们清晰并摆脱这种类型的混淆。
$ .gettJSON()函数是一个简写的Ajax函数(内部使用带有数据类型脚本的$ .get()),它相当于下面的表达式,使用一些有限的条件,比如Request类型是GET,数据类型是json。
阅读更多.. jquery-post-vs-get-vs-ajax
答案 4 :(得分:4)
我看到的唯一区别是getJSON执行GET请求而不是POST。
答案 5 :(得分:0)
contentType: 'application/json; charset=utf-8'
不好。至少它对我不起作用。另一种语法没问题。您提供的参数格式正确。
答案 6 :(得分:0)
使用$ .getJSON())没有任何错误回调只有你可以跟踪成功回调,并且没有像beforeSend,statusCode,mimeType等支持的标准设置,如果你想要它使用$ .ajax()。