ASP.NET MVC JsonResult返回500

时间:2010-06-24 21:19:09

标签: asp.net-mvc json jquery

我有这种控制器方法:

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.问题是什么?

谢谢

2 个答案:

答案 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) }
        });