2010-06-24 24 views
7

tengo este método controlador:ASP.NET MVC JsonResult devolver 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); 
} 

En el lado del cliente, tener este script jQuery:

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

siempre me aparece un código de error 500. ¿Cuál es la ¿problema?

Gracias

+0

Esto se aplica a ASP.NET MVC 2, correcto? El requisito JsonRequestBehavior.AllowGet comenzó con la versión 2. – JustinStolle

Respuesta

18

Si usted vio la respuesta real, es probable que decir

Esta solicitud ha sido bloqueado debido a información sensible podría revelada a terceros sitios web cuando este se usa en una solicitud GET Para permitir solicitudes GET, establezca JsonRequestBehavior en AllowGet.

Tendrá que utilizar la sobrecarga Json constructor para incluir una JsonRequestBehavior de JsonRequestBehavior.AllowGet tales como:

return Json(list, JsonRequestBehavior.AllowGet); 

Así es como se ve en el ejemplo de código (tenga en cuenta esto también cambia sus int s a string s o de lo contrario obtendrías otro error).

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

Esta es la respuesta correcta y se debe marcar como aceptada. –

+1

También mencione que puede anular el comportamiento JSON en jQuery para usar POST. –

+1

Correcto, especialmente si devuelve algo que pueda considerarse confidencial, decore su método de controlador con '[HttpPost]' y use la función jQuery '$ .post()' en su lugar (vea http://api.jquery.com /jQuery.post/) – JustinStolle

0

Mientras que la respuesta de JustinStolle resuelve su problema, me gustaría prestar atención al error proporcionado por el marco. A menos que tenga una buena razón para querer enviar sus datos con el método GET, debe intentar enviarlos con el método POST.

El hecho es que cuando utiliza el método GET, sus parámetros se agregan a su url de solicitud en lugar de agregarse a los encabezados/cuerpo de su solicitud. Esto podría parecer una pequeña diferencia, pero el error sugiere por qué es importante. Los servidores proxy y otros servidores potenciales entre el emisor y el receptor son propensos a registrar la URL de solicitud y, a menudo, ignoran los encabezados y/o el cuerpo de la solicitud. Esta información también se considera como no importante/secreta, por lo que cualquier información expuesta en la url es mucho menos segura por defecto.

La mejor práctica es entonces enviar sus datos con el método POST para que sus datos se agreguen al cuerpo en lugar de la url. Afortunadamente esto se puede cambiar fácilmente, especialmente porque estás usando jquery. También se puede usar la envoltura $.post o añadir tipo: "POST" a sus parámetros:

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