Подтвердить что ты не робот

Что вернуть из действия ASP.NET MVC, чтобы запустить событие jQuery ajax success?

Прямо сейчас все мои записи ajax запускают события Error, даже если действие не вызвало ошибку. У меня есть действие ASP.NET MVC, которое выглядит следующим образом:

[AcceptVerbs(HttpVerbs.Post)]
public virtual ActionResult StuffToDo(int id)
{
     // do various things that work ...
     return new JsonResult(); // i have to return something, so this...
}

На стороне клиента у меня есть этот jQuery:

$('#actionClick').click(function() {
     if (confirm('Are you sure?')) {
         $.ajax({
             type: "POST",
             url: "/Customer/StuffToDo/<%= Model.Customer.Id %>",
             contentType: "application/json; charset=utf-8",
             data: "{}",
             dataType: "json",
             success: function() {
                 ShowSuccessResult("Yay!");
             },
             error: function(xhr, ajaxOptions, thrownError) {
                 ShowErrorResult("Boo! Message:" + xhr.responseText);
             }
         });
      }
      return false;
 });

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

Я понимаю, что этот вопрос в основном такой же, как и этот другой вопрос, но мой обработчик ошибок уже имеет расширенную сигнатуру, которая решает вопрос другого человека.

Я изменил возвращаемое значение на Null, чтобы посмотреть, повлияло ли это на что-либо, но не изменилось поведение.

Похоже, это проблема с HTTPS. Я получаю несколько ответов на запрос. Первые 2 сообщения 401, а затем я получаю 200.

4b9b3361

Ответ 1

Я считаю, что проблема в том, что вы ничего не возвращаете в JsonResult. Попробуйте:

return this.Json(string.Empty);

и посмотрите, работает ли это. Я думаю, что проблема в том, что вы ничего не возвращаете в вызов jQuery, а не пустой набор JSON:

{}

Ответ 2

Возвращение пустого результата также может быть полезно

return new EmptyResult();

Примечание. Тип возврата не обязательно должен быть ActionResult или событием, которое наследует от него. Фактически mvc позволит вам вызвать любой общедоступный метод. Однако вы всегда должны использовать самый явный тип возврата, который вы хотите, как и любой другой метод (например, JsonResult).

Ответ 3

2 быстрых заметок для тех, кто приземляется здесь, пытаясь вызвать обратный вызов ajax jQuery success от контроллера MVC:

  • Если вы используете type: "GET" в своем Ajax, вам нужно включить JsonRequestBehavior.AllowGet, чтобы обойти меры защиты JSON Hijacking по умолчанию.

 return Json(true, JsonRequestBehavior.AllowGet);
  1. Как указано выше, если вы указали dataType: 'json' в запросе Ajax, если вы делаете односторонний вызов (например, Save), где вам ничего не нужно, вы можете вернуть что угодно сериализуется как Json с контроллера. Но с 200, что-то должно быть возвращено. Используйте 204, если данные не возвращаются.

Неверно - запускает обработчик Ajax error!

 // Nope - Status 200 must have some content
 return new HttpStatusCodeResult(HttpStatusCode.OK);

 // Also returns a 200 with no data - not allowed
 return new EmptyResult();

Работает - запускает обработчик успеха Ajax:

 // Return a 204 if there no data
 return new HttpStatusCodeResult(HttpStatusCode.NoContent);

 // Return something with a 200 return
 return Json(new {Success = true});

Ответ 4

Тип возвращаемого значения для вашего метода должен быть JsonResult вместо ActionResult.