2011-06-01 36 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