2010-06-24 3 views
7

Je cette méthode du contrôleur:ASP.NET MVC JsonResult retour 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); 
} 

Du côté client, ont ce 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) } 
     }); 
    }); 

Je reçois toujours un code d'erreur 500. Quelle est la problème?

Merci

+0

Cela s'applique à ASP.NET MVC 2, correct? L'exigence JsonRequestBehavior.AllowGet a démarré avec la version 2. – JustinStolle

Répondre

18

Si vous avez vu la réponse réelle, il serait probablement dire

Cette demande a été bloquée car informations sensibles pourraient être divulgués à des sites Web tiers lorsque cela est utilisé dans une requête GET. Pour autoriser les demandes GET, définissez JsonRequestBehavior à AllowGet.

Vous aurez besoin d'utiliser le constructeur Json surchargé d'inclure un JsonRequestBehavior de JsonRequestBehavior.AllowGet tels que:

return Json(list, JsonRequestBehavior.AllowGet); 

Voilà comment il ressemble dans votre code exemple (notez cela change aussi vos int s à string s ou bien vous auriez une autre erreur).

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

Cette réponse est correcte et doit être marquée comme acceptée. –

+1

Mentionnez également que vous pouvez remplacer le comportement JSON dans jQuery pour utiliser POST. –

+1

Correctement, surtout si vous renvoyez quelque chose qui peut être considéré comme sensible, décorez votre méthode de contrôleur avec '[HttpPost]' et utilisez plutôt la fonction jQuery '$ .post()' (voir http://api.jquery.com /jQuery.post/) – JustinStolle

0

Alors que la réponse de JustinStolle résout votre problème, je ferais attention à l'erreur fournie par le cadre. Sauf si vous avez une bonne raison de vouloir envoyer vos données avec la méthode GET, vous devriez essayer de l'envoyer avec la méthode POST. Le fait est que lorsque vous utilisez la méthode GET, vos paramètres sont ajoutés à l'URL de votre requête au lieu d'être ajoutés aux en-têtes/corps de votre requête. Cela peut sembler une petite différence, mais l'erreur indique pourquoi c'est important. Les serveurs proxy et autres serveurs potentiels entre l'expéditeur et le destinataire sont enclins à consigner l'URL de la requête et ignorent souvent les en-têtes et/ou le corps de la requête. Cette information est également souvent considérée comme non importante/secrète, de sorte que toutes les données exposées dans l'URL sont beaucoup moins sécurisées par défaut. La meilleure pratique consiste alors à envoyer vos données avec la méthode POST afin que vos données soient ajoutées au corps au lieu de l'URL. Heureusement, cela est facilement changé, surtout depuis que vous utilisez jquery. Vous pouvez utiliser l'emballage $.post ou ajouter le type: "POST" à vos paramètres:

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