ASP.NET MVC2 JsonResult Этот запрос заблокирован

Я знаю, что вопрос очень знаком, но я не могу над ним.

Это мое действие контроллера

public JsonResult AddToCart(int productId, int quantity = 1, int optionValue = 0)
{
  AjaxActionResponse res = new AjaxActionResponse();
  res.Result = ture;
  ......
  return Json(res, JsonRequestBehavior.AllowGet);
}

и это мой запрос ajax

$.ajax({
    type: "GET",
    contentType: "application/json; charset=utf-8",
    url: "<%= Url.Action("AddToCart", "CartAjax") %>",
    data: ({'productId': productId, 'quantity': quantity, 'optionValue': optionValue}),
    dataType: "json",
    success: function (d) {
        if ($.isEmptyObject(d)) {
            return;
        }
        if (!d.Result) {
            alert(d.ErrorMessage[0].ErrorMessage);
        }
        else {
            $("#myCartBox").dialog("open");
        }
        return;
    }
});

когда я запускаю запрос ajax, всплывает известная ошибка

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

Я попытался сделать действие AddToCart [HttpPost] приемлемым, но в настоящее время: параметры так и не поступили в метод, а из запроса была возвращена ошибка отсутствия аргумента (ошибка 500 int. serv)

Я могу работать только с методом get, но в настоящее время запрос заблокирован :)

Я что-то упускаю? Или как правильно выполнить запрос MVC2 Ajax. WebForms очень успешно вызывал методы из JavaScript, но я не мог этого сделать в MVC.

Любая идея?


person Orhaan    schedule 17.12.2010    source источник


Ответы (2)


Вы пытались использовать POST, используя эту сигнатуру метода?

[HttpPost]
public ActionResult AddToCart(FormCollection form)

Или с помощью привязки данных:

public class CartItem {
    public int productId {get; set;}
    public int quantity {get; set;}
    public int optionValue {get; set;}
}

Потом:

 public ActionResult AddToCart(CartItem c)

К сожалению, у меня нет хорошего ответа, но я решил некоторые из своих проблем таким образом (вместо того, чтобы выяснять, как правильно передавать параметры с помощью маршрутов).

person Kevin Stricker    schedule 17.12.2010
comment
Боже мой, это работает :) Я думаю, что привязка модели - правильный путь для таких запросов. Большое спасибо @mootinator и другим участникам :) - person Orhaan; 17.12.2010

Я не знаю наверняка, что это ваша основная проблема, но вы не должны устанавливать тип контента в text/html. Это не то, что вы отправляете, и не то, что ожидает MVC. Полностью опустите этот параметр, и пусть jQuery установит для него значение application/x-www-form-urlencoded, что подходит.

person Dave Ward    schedule 17.12.2010
comment
Эм, да, ты прав, но я просто пытался. Первая версия моего кода имеет тип содержимого application/json, но ничего не изменилось. - person Orhaan; 17.12.2010
comment
application/json тоже будет неверным. Этот параметр данных не будет отправлен на сервер в формате JSON. Попробуйте опустить тип содержимого; jQuery автоматически устанавливает его правильно для обычных запросов с urlencoded. - person Dave Ward; 17.12.2010
comment
на самом деле вы можете полностью опустить contentType и позволить jQuery установить его. - person rob waminal; 17.12.2010
comment
Я так сделал, но ничего не изменилось :( - person Orhaan; 17.12.2010
comment
Вы уверены, что запрос перенаправляется на действие контроллера, как вы думаете? Это была ошибка, которая преследовала меня в прошлом. Поскольку маршруты жадные, с этим легко столкнуться. Если ваш запрос перенаправлялся на неправильное действие, было бы логично, если бы добавление AllowGet к этому привело бы к той же ошибке. - person Dave Ward; 17.12.2010