2011-06-01 84 views
4

我想用jQuery.getJSON功能在ASP.NET MVC 3.0,所以我写了下面的代码测试:

<input id="btn" type="button" /> 

<script> 
     $("#btn").click(function() { 
      $.getJSON("/Location/GetData", null, function (data) { 
       alert(data); 
      }); 
     }); 


</script> 

,我有以下LocationController方法:

public JsonResult GetData() 
     { 
      List<int> result = new List<int>(){1, 4, 5}; 
      return Json(result); 
     } 

但它不起作用! GetData方法调用,但'alert'未显示!

+0

,你应该使用Firebug并打开网络选项卡上,并检查XHR。它应该告诉你你的ajax调用的帖子和响应是什么。 – melaos 2011-06-01 06:34:54

回答

7

你需要告诉MVC允许称为你的JSON通过行动改变你的回归式GET:

return Json(result, JsonRequestBehavior.AllowGet); 

默认情况下(for security reasons)他们只允许通过的POST请求JSON。

+0

虽然这确实允许某人通过该问题,但由于您提到的安全问题,这不是一个好的解决方案。更好的答案是http://stackoverflow.com/a/6196969/39532 – mezoid 2013-03-16 07:25:27

+0

@mezoid - 只要您不使用传递敏感信息(或执行操作),将JSON与GET结合使用并无任何内在错误, 。许多库允许/支持它(jQuery具有'getJSON',谷歌地图API支持JSON GETs等等)。与开发中的许多事情一样,它基本归结为意识到安全问题(与我的答案相关)并使用正确的工具进行工作。 – Alconja 2013-03-17 23:16:46

+0

我同意你的意见。然而,目前还不清楚在现实世界的用例中是否有敏感数据。我可以想象,操作和其他从您的回复中受益的人可能会将理所当然的答案视为理所当然,而不是深入了解安全问题。如果你把它分成两部分,我会认为你的答案会更好。 1如果您有敏感数据,请执行此操作... 2如果您知道您的数据不敏感,则可以执行此操作... – mezoid 2013-03-19 03:29:55

2

首先。安装Firebug for Firefox,以便您可以检查服务器发送的响应,Chrome和IE内置了您也可以使用的工具。

不知道回应我会假设问题是,ASP.NET MVC保护您免受JSON劫持byt不允许默认情况下为GET请求返回JSON。

尝试更改为:

return Json(result, JsonRequestBehavior.AllowGet); 
4

为了防止cross-side-scripting attacks & JSON Hijacking,MVC 2+(我认为这是2),要求您在使用POST,而不是GET访问与JSON响应行动。

您可以通过使用Json()的重载来覆盖此行为,您可以在其中设置JsonRequestBehavior.AllowGet标志,但如博文中所述,这不是一个好的/安全的想法。

我做所有JSON请求的方式,无论它们是jsut加载数据还是回发,都是使用$.post jQuery方法,并将控制器操作限制为只接受HttpPost

因此您的代码将成为:

$("#btn").click(function() { 
    $.post("/Location/GetData", null, function (data) { 
     alert(data); 
    }); 
}); 

[HttpPost] 
public JsonResult GetData() 
{ 
    List<int> result = new List<int>(){1, 4, 5}; 
    return Json(result); 
} 
+0

这很好,避免了安全问题! – mezoid 2013-03-16 07:23:59