我有jQuery代码从服务器获取JSON:
$(document).ready(function () {
$.getJSON('Default2.aspx/GetPerson', { 'firstname': 'brian', 'lastname': 'lee' }, function (response) {
alert(response.Age);
});
});
Default2.aspx代码:
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public static String GetPerson(String firstname, String lastname)
{
Person p = new Person(firstname, lastname);
return "{\"Age\":\"12\"}";
}
问题是:
为什么我的脚本没有调用GetPerson
方法?我将调试器附加在GetPerson
中,但似乎没有调用。
任何帮助都会受到赞赏!
答案 0 :(得分:5)
WebMethod
会回复POST
而不是GET
次请求。
$.ajax({
type: 'POST',
url: 'Default2.aspx/GetPerson',
dataType: 'json',
// ...
});
并且,请求格式也应该是JSON以匹配ResponseFormat
:
// ...
data: JSON.stringify({ 'firstname': 'brian', 'lastname': 'lee' }),
contentType: 'application/json'
或者,可以将ScriptMethod
配置为使用GET
代替:
[ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)]
虽然仍然需要为contentType
设置,因此无法使用$.getJSON()
:
$.ajax({
type: 'GET',
url: 'Default2.aspx/GetPerson',
dataType: 'json',
contentType: 'application/json',
// ...
});
并且,data
将进行URL编码,但在此之前,每个值都需要进行JSON编码:
// ...
data: {
firstname: JSON.stringify('brian'),
lastname: JSON.stringify('lee')
}
另请注意,ScriptMethod
会将其响应包装在{ "d": ... }
对象中。而且,由于return
值为String
,因此"d"
的值为同一个未解析的String
:
// ...
success: function (response) {
response = JSON.parse(response.d);
alert(response.Age);
}