我有这种控制器方法:
public JsonResult List(int number)
{
var list = new Dictionary<int, string>();
list.Add(1, "one");
list.Add(2, "two");
list.Add(3, "three");
var q = (from h in list
where h.Key == number
select new
{
key = h.Key,
value = h.Value
});
return Json(list);
}
在客户端,有这个jQuery脚本:
$("#radio1").click(function () {
$.ajax({
url: "/Home/List",
dataType: "json",
data: { number: '1' },
success: function (data) { alert(data) },
error: function (xhr) { alert(xhr.status) }
});
});
我总是收到错误代码500.问题是什么?
谢谢
答案 0 :(得分:19)
如果你看到实际的反应,可能会说
此请求已被阻止,因为 敏感信息可能是 向第三方网站披露 当在GET请求中使用它时。至 允许GET请求,设置 JsonRequestBehavior to AllowGet。
您需要使用重载的Json
构造函数来包含JsonRequestBehavior
JsonRequestBehavior.AllowGet
,例如:
return Json(list, JsonRequestBehavior.AllowGet);
以下是您在示例代码中的显示方式(请注意,这也会将您的int
更改为string
,否则您会收到其他错误。
public JsonResult List(int number) {
var list = new Dictionary<string, string>();
list.Add("1", "one");
list.Add("2", "two");
list.Add("3", "three");
var q = (from h in list
where h.Key == number.ToString()
select new {
key = h.Key,
value = h.Value
});
return Json(list, JsonRequestBehavior.AllowGet);
}
答案 1 :(得分:0)
虽然JustinStolle的答案解决了您的问题,但我会注意框架提供的错误。除非您有充分理由希望使用GET
方法发送数据,否则您应该使用POST
方法发送数据。
问题是,当您使用GET
方法时,您的参数会添加到您的请求网址中,而不是添加到请求的标头/正文中。这似乎是一个微小的差异,但错误暗示了它为什么重要。发送方和接收方之间的代理服务器和其他潜在服务器易于记录请求URL,并且经常忽略请求的标头和/或主体。此信息通常也被视为非重要/秘密,因此默认情况下,网址中公开的任何数据都不太安全。
最佳做法是使用POST
方法发送您的数据,以便将数据添加到正文而不是网址。幸运的是,这很容易改变,特别是因为你正在使用jquery。您可以使用$.post
包装器或添加类型:&#34; POST&#34;你的参数:
$.ajax({
url: "/Home/List",
type: "POST",
dataType: "json",
data: { number: '1' },
success: function (data) { alert(data) },
error: function (xhr) { alert(xhr.status) }
});