2010-06-24 89 views
7

我有这样的控制方法:ASP.NET MVC JsonResult返回500

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

这适用于ASP.NET MVC 2,正确吗? JsonRequestBehavior.AllowGet要求从版本2开始。 – JustinStolle 2010-06-24 22:49:46

回答

18

如果你看到实际的响应,它可能会说

该请求已被阻止,因为 敏感信息可以 透露给第三方网站 这是用来当在GET请求中。若要 允许GET请求,请将 JsonRequestBehavior设置为AllowGet。

你需要使用重载Json构造包括JsonRequestBehavior.AllowGet如的JsonRequestBehavior

return Json(list, JsonRequestBehavior.AllowGet); 

这里是它的外观在您的示例代码(注意,这也改变了你int s到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); 
} 
+2

这是正确答案,应该被标记为接受。 – 2010-06-24 22:47:17

+1

另外提到你可以重写jQuery中的JSON行为来使用POST。 – 2010-06-24 22:47:37

+1

对,特别是如果你要返回任何可能被认为是敏感的东西,用'[HttpPost]'装饰你的控制器方法,并使用jQuery'$ .post()'函数代替(参见http://api.jquery.com /jQuery.post/) – JustinStolle 2010-06-24 22:53:55

0

虽然JustinStolle的答案解决了您的问题,但我会注意框架提供的错误。除非您有充分的理由希望通过GET方法发送数据,否则您应该使用POST方法发送数据。

问题是,当您使用GET方法时,您的参数将被添加到您的请求url中,而不是添加到请求的标头/正文中。这可能看起来像一个微小的差异,但错误暗示为什么它很重要。发送者和接收者之间的代理服务器和其他潜在服务器很容易记录请求URL,并经常忽略请求的头部和/或主体。这些信息通常也被认为是不重要的/秘密的,因此默认情况下,网址中暴露的任何数据都不安全。

然后最好的做法是发送您的数据与POST方法,以便您的数据被添加到身体而不是网址。幸运的是,这很容易改变,特别是因为你使用jQuery。您可以使用$.post包装或添加类型:“POST”为您的参数:

$.ajax({ 
      url: "/Home/List", 
      type: "POST", 
      dataType: "json", 
      data: { number: '1' }, 
      success: function (data) { alert(data) }, 
      error: function (xhr) { alert(xhr.status) } 
     });