Asp.net mvc jQuery中$.getJSON()和$.ajax()之间的差异

Asp.net mvc jQuery中$.getJSON()和$.ajax()之间的差异,asp.net-mvc,jquery,Asp.net Mvc,Jquery,我正在调用ASP.NET MVC操作 public JsonResult GetPatient(string patientID) { ... 使用jQuery从JavaScript获取。下面的调用有效 $.getJSON( '/Services/GetPatient', { patientID: "1" }, function(jsonData) { alert(jsonData); }); 而这一个没有 $.ajax({ type: 'POST', url: '/Servic

我正在调用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方法,但是patientID值为null,带有$.ajax调用。我想对一些高级回调使用$.ajax调用


任何想法都值得赞赏。

我看到的唯一区别是getJSON执行GET请求而不是POST。

替换

data: { patientID: "1" },


进一步阅读:

.getJson只是一个围绕.ajax的包装器,但它提供了一个更简单的方法签名,因为一些设置是默认的,例如dataType为json,type为get等

加载、.get和.post也是围绕.ajax方法的简单包装

contentType: 'application/json; charset=utf-8'

这不好。至少它对我不起作用。另一个语法是ok。您提供的参数格式正确。

内容类型

您不需要在调用MVC控制器操作时指定该内容类型。只有在调用ASP.NET AJAX“ScriptServices”和page方法时,才需要特殊的“application/json;charset=utf-8”内容类型。jQuery的默认contentType“application/x-www-form-urlencoded”适合于请求MVC控制器操作

有关该内容类型的详细信息,请参见此处:

数据

数据是正确的,因为你有它。通过向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);
  }
});

jquery的一些函数,如$.ajax、$.get、$.post、$.getScript、$.getJSON,有很多混淆,它们之间的区别是什么,哪一个最好,哪一个最快,使用哪一个,下面是对它们的描述,以使它们清晰,并消除这种混淆

$.getJSON()函数是一个速记Ajax函数(内部使用$.get()和数据类型脚本),它等效于下面的表达式,使用了一些有限的条件,如请求类型为get,数据类型为json


多读些

使用$.getJSON())没有任何错误回调,只有您可以跟踪成功的回调,并且不支持标准设置,如beforeSend、statusCode、mimeType等,如果您想使用$.ajax()。

这不一定是类似于数据:{patientID:“1”}的设置,以避免嵌套的双引号吗?不行。此更改的操作方法中的值为null。请尝试删除您指定的contentType设置。我认为方法参数必须与JSON键相同。i、 e.人格。除此之外,我不确定是否有问题,因为我已经多次使用此语法,而且它不会出现任何问题。必须手动执行此操作非常可怕,因此我建议使用-这可以让您使用$.compactJSON()方法包装真正的JSON对象,该方法将自动将对象作为字符串发送,减少了所有方面的麻烦。尝试更改要获取的类型,并且rpcutts中的数据发生了更改,但action方法中的值仍然为null。谢谢。这就解决了问题。我使用$.compactJSON()将JS对象格式化为数据选项的JSON。由于$.compactJSON在jQuery中不再可用,我在这里使用了这个插件中的$.toJSON:有人删除了链接,没有它这个答案毫无意义,所以我将它回滚。
$.ajax({
  type: 'POST',
  url: '/Services/GetPatient',
  data: { 'patientID' : 1 },
  dataType: 'json',
  success: function(jsonData) {
    alert(jsonData);
  },
  error: function() {
    alert('Error loading PatientID=' + id);
  }
});