Просмотр, jQuery AJAX, Colorbox, ошибка разбора

  • скажем, у меня есть ссылка на действие на странице (назовем ее MainPage).
  • Actionlink указывает на метод действия, который возвращает View (давайте назовем его PopupView).
  • И скрипт на главной странице document.ready() говорит: «прикрепите плагин colorbox к элементу actionlink, чтобы, когда пользователь нажимает на него, открывался PopupView».
  • PopupView имеет форму:

    @using (Html.BeginForm("SavePopupData", "Home", FormMethod.Post))
    
  • Также PopupView переопределяет поведение отправки по умолчанию:

    $("form[action$='SavePopupData']").submit(function () {  
    
      $.ajax({
        url: $(this).attr("action"),
        contentType: 'application/json; charset=utf-8',
        type: "POST",
        success: function (data, textStatus, jqXHR) { alert('success!'); },
        complete: function (jqXHR, textStatus) { alert('complete!') },
        data: JSON.stringify(someData),
        dataType: "json",
        error: function (jqXHR, textStatus, errorThrown) { alert(textStatus); }
       });
    
      return false;
    }
    
  • Давайте посмотрим, что находится в методе действия SavePopupData:

    [HttpPost]
    public ActionResult SavePopupData(SomeDataType someData)
    {
       bool result = _dal.SavePopupData(someData);
       return new JsonResult { Data = result };
    }
    

Теперь здесь все работает как задумано. Ну, почти все. on Submit, если вы поставите точку останова на метод действия SavePopupData, вы увидите, что данные благополучно попадают на сервер, хорошо анализируются и _dal возвращает результат. И все работает нормально.

Но когда он возвращается к клиенту, обратный вызов success никогда не запускается, а предупреждает в обратном вызове error об ошибке синтаксического анализа.

Как ни странно, если вы оставите все как есть и избавитесь только от элементов colorbox, это сработает. Хотя он откроет форму в новом окне (чего я не хочу).

Что происходит с включенным colorobox? Технически он создает всплывающее окно как часть страницы MainView. Я даже не могу отладить скрипт PopupView, потому что ни Firebug, ни инструменты разработчика Chrome его не распознают, а в списке скриптов такого скрипта нет. Тем не менее, во время выполнения он все еще работает.

Ребята, вы хоть представляете, что это может быть? Я думаю, что это может быть как-то связано с context в $.ajax. Но что я должен передать в него, я не знаю. Помоги мне, пожалуйста


person iLemming    schedule 13.04.2011    source источник


Ответы (1)


Вы должны вернуть результат Json, а не JsonResult от действия вашего контроллера.

[HttpPost]
public ActionResult SavePopupData(SomeDataType someData)
{
   bool result = _dal.SavePopupData(someData);
   return Json(new { Data = result });
} 

Я исправлен, но с вашим текущим подходом это приведет к сбою на стороне клиента, поскольку свойство Data JsonResult не является парой ключ/значение, тогда как в приведенном выше коде это так. Разница очень тонкая, вызывает много головной боли. Вы можете изменить свой текущий метод на

return new JsonResult { Data = new {Data = result} }; 
person Ahmad    schedule 14.04.2011
comment
Я не знаю, может быть, вы правы ... но я уже пошел дальше и решил не использовать colorbox, поэтому я не могу проверить, что вы предложили. Может быть, позже, просто ради любопытства... - person iLemming; 16.04.2011