ASP.NET MVC JsonResult возвращает 500 - PullRequest
8 голосов
/ 25 июня 2010

У меня есть такой метод контроллера:

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 ]

19 голосов
/ 25 июня 2010

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

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

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

return Json(list, JsonRequestBehavior.AllowGet);

Вот как это выглядит в вашем примере кода (обратите внимание, это также изменяет ваши int s на 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);
}
0 голосов
/ 13 февраля 2015

Хотя ответ 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) }
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...