所以我是一名ASP.NET开发人员。首先我尝试了这个:
$.getJSON('/Admin/GetPrelimsByJob/109', function (data) {
var template = $('#optionTemplate').html();
var html = Mustache.to_html(template, data);
$('#sampleArea').html(html);
});
使用控制器方法签名:
[HttpGet]
public JsonResult GetPrelimsByJob(int jobId)
我的第一个错误是没有通过ASP.NET引擎解析和发现ID。
出于测试目的,我退后一步并停止传递id:
$.getJSON('/Admin/GetPrelimsByJob', function (data) {
var template = $('#optionTemplate').html();
var html = Mustache.to_html(template, data);
$('#sampleArea').html(html);
});
控制器签名; [HTTPGET] public JsonResult GetPrelimsByJob()
我的第二个错误是: 此请求已被阻止,因为当在GET请求中使用敏感信息时,可能会向第三方网站公开敏感信息。要允许GET请求,请将JsonRequestBehavior设置为AllowGet。
我知道我可以将JsonRequestBehavior设置为GET来解决这个问题,但为什么这是一个问题,为什么我的回复与我要做POST请求的不同。
最后,为了让事情发挥作用我做了:
$.postJSON('/Admin/GetPrelimsByJob', { jobId: 109 }, function (data) {
var template = $('#optionTemplate').html();
var html = Mustache.to_html(template, data);
$('#sampleArea').html(html);
});
我的控制器签名是:
[HttpPost]
public JsonResult GetPrelimsByJob(int jobId)
我的jQuery扩展名是:
$.postJSON('/Admin/GetPrelimsByJob', { jobId: 109 }, function (data) {
var template = $('#optionTemplate').html();
var html = Mustache.to_html(template, data);
$('#sampleArea').html(html);
});
如果我切换到POST请求,我知道一切正常,但我想知道为什么。
所以回顾一下: 1)为什么在通过GET请求传递id时,我的id没有被ASP.NET引擎解析。
2)为什么我必须将JsonRequestBehavior设置为AllowGet以获取我的请求以允许JSON数据进入响应。
3)为什么POST只适用于这种情况,我正在获取数据,似乎RESTful HTTP动作动词GET应该是合适的选择。并不是说我试图严格遵守REST。
答案 0 :(得分:1)
2)为了让您更加关注通过GET提供json所涉及的安全问题,请参阅此处:Why is JsonRequestBehavior needed?
3)默认情况下,浏览器不允许您制作跨域POST,这就是为什么POST的请求比GET请求更不容易受到CSRF的影响,因此您不会# 39;根本不需要设置JsonRequestBehavior。