2010-06-24 14 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

ответ

18

Если вы увидели фактический ответ, он бы, вероятно, сказать

Этот запрос был заблокирован, потому что секретная информация может быть раскрыта третьим сторонних веб-сайтах когда используется в запросе GET. К разрешить запросы GET, установить JsonRequestBehavior для разрешенияGet.

Вы должны будете использовать перегруженный Json конструктор включать JsonRequestBehavior из JsonRequestBehavior.AllowGet, таких как:

return Json(list, JsonRequestBehavior.AllowGet); 

Вот как это выглядит в вашем примере кода (обратите внимание, это также изменяет свои int с до string s, иначе вы получите еще одну ошибку).

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

Это правильный ответ и должен быть отмечен как принятый. –

+1

Также упоминайте, что вы можете переопределить поведение JSON в jQuery для использования POST. –

+1

Правильно, особенно если вы возвращаете все, что может считаться чувствительным, украсьте свой метод контроллера с помощью '[HttpPost]' и используйте функцию jQuery '$ .post()' (см. Http://api.jquery.com /jQuery.post/) – JustinStolle

0

Хотя ответ JustinStolle решает вашу проблему, я обратил бы внимание на ошибку, предоставленную из фреймворка. Если у вас нет веских оснований для отправки ваших данных с помощью метода GET, вы должны направить его с помощью метода POST.

Дело в том, что при использовании метода GET ваши параметры добавляются к URL-адресу вашего запроса, а не добавляются в заголовок/тело вашего запроса. Это может показаться крошечной разницей, но ошибка подсказывает, почему это важно. Прокси-серверы и другие потенциальные серверы между отправителем и получателем склонны регистрировать URL-адрес запроса и часто игнорируют заголовки и/или тело запроса. Эта информация также часто считается неважной/секретной, поэтому любые данные, отображаемые в URL-адресе, по умолчанию менее безопасны.

Лучшая практика заключается в том, чтобы отправить ваши данные с помощью метода POST, чтобы ваши данные были добавлены в тело вместо URL-адреса. К счастью, это легко изменить, тем более, что вы используете 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) } 
     }); 
Смежные вопросы