jQuery ajaxForm возвращая .json файл

У меня есть образцовая форма создания в направляющих, которые у меня также есть возврат JSON через ajax. Мой код до сих пор похож:

$('#new_stem').ajaxForm({ //#new_stem is my form
  dataType: 'json',
  success: formSuccess
});

function formSuccess(stemObj) {
  //does stuff with stemObj
}

И у меня есть многослойная форма с загрузчиком файла (но я не уверен, релевантно ли это).

Когда я отправляю форму, она хорошо работает (мои модели правильно создаются и рендеринг как json), но вместо json того, чтобы быть обработанным функцией formSuccess, она запрашивает загрузку "stems.json" (путь к моему действию создания основы) в Firefox.

Что заставило бы это происходить, и что могло решить его? Не уверенный, если это - часть проблемы, но у меня нет кнопки отправки в моей форме, у меня есть ссылка с обработчиком щелчков, который называет $ ('#new_stem) .submit ()

Спасибо, ребята!

Править: Firebug говорит мне, что заголовок содержит следующее:

Etag        "b53e5247e7719cf6b1840e2c6e68781c"
Connection      Keep-Alive
Content-Type    application/json; charset=utf-8
Date        Mon, 03 May 2010 02:19:31 GMT
Server      WEBrick/1.3.1 (Ruby/1.8.7/2010-01-10)
X-Runtime       241570
Content-Length  265
Cache-Control   private, max-age=0, must-revalidate

плюс заголовок cookie

10
задан Lowgain 3 May 2010 в 02:29
поделиться

6 ответов

Хотя я не совсем то, что я стремился решить, я смог прийти к немного другому решению, которое соответствовало моим потребностям!

Поскольку загрузка файлов ajax выполняется через iframe, проблема заключалась в том, что после того, как iframe загрузил файл .json, Firefox интерпретировал его как загрузку, и было открыто приглашение загрузки. Я почти уверен, что мог бы поиграть с некоторыми настройками сервера, чтобы предотвратить это, но я уже потратил на это достаточно времени.

То, что я сделал, - это визуализация вывода в виде текста, а не json, потому что я все равно ловил только один номер id. Теперь мой код выглядит так:

$(document).ready(function() {
  $('#continue-upload').click(function() {
    $('#new_stem').ajaxSubmit({
      dataType: 'text', //'json',
      success: formSuccess
    });
  });
});

Нужный мне идентификатор также был заключен в предварительные теги, поэтому мне также нужно было убрать их в моей функции результатов.

Это делает то, что я хочу сейчас, у-у!

2
ответ дан 3 December 2019 в 22:35
поделиться

Вы отменяете действие по умолчанию события submit? Похоже, что форма действительно отправляется (в классическом смысле - другими словами, Firefox действительно переходит на страницу, указанную в action формы).

0
ответ дан 3 December 2019 в 22:35
поделиться

Звучит так, как будто его заголовок ответа Content-Type неправильный, и поэтому браузер не знает, что с ним делать. Это должно быть application/json. Вы можете использовать панель Firebug Net для детемина фактических заголовков ответов.

1
ответ дан 3 December 2019 в 22:35
поделиться

Этот плагин позволит вам отправлять MultiPart Forms с помощью ajax.

Если вы хотите использовать опцию Ajax 'success:', вы должны отправить форму с помощью ajax. В настоящее время вы используете функцию submit(), которая в основном просто отправляет форму традиционным способом. Тот факт, что вы можете видеть json-данные в виде загруженного файла или в браузере, означает, что это происходит.

Вам нужно использовать этот плагин (если вам нужна функция multipart - в противном случае просто используйте обычную функцию Ajax)

С плагином вы будете использовать его следующим образом:

$("#SubmitButton").click(function(){


$.ajaxFileUpload(
    {
    url:serverurl,
    secureuri:false,
    fileElementId:elementId,
    dataType: 'json',
    success: function (data, status)
    {
  /* show success message */
    },
    error: function (data, status, e)
    {
  /* handle error */
    }
});

});

Если вы хотите сделать это без загрузки файла, есть более простой способ сделать это.

$("#SubmitButton").click(function(){

$.post('YOUR_URL', $("#FormName").serialize(), function(data){
     alert(data.name); // John
   }, "json");  //specify return data is going to be json


    });
2
ответ дан 3 December 2019 в 22:35
поделиться

Может быть, это поможет

$('#cpFileUpload').ajaxForm({
        dataType: 'html',           
        success: function(data) {           
            eval(data);                 
            if (data.result == false) {
                alert('error on server side');
            } else {                
                // do what you want
            }
        }       
    }); 

И на стороне сервера вывод должен быть таким (только этот вывод или без какого-либо другого текста внутри тега тела)

var data = {result: true, html: 'ok'}

Не очень хорошо, но работает

0
ответ дан 3 December 2019 в 22:35
поделиться

Чтобы браузер не запускал загрузку файла .json, установите для заголовка Content-type значение «text / html».

PHP:

header("Content-type: text/html");

ASP.NET MVC:

return Json(obj, "text/html");

В javascript вам нужно проанализировать текстовый результат, например:

$(".addform").ajaxSubmit({
            url: "file.php",
            type: "POST",
            dataType: "text",
            iframe: true,
            success: function (text) {
                var data = $.parseJSON(text);
            },
            error: function (xmlRequest, textStatus, errorThrown) {
                alert(errorThrown);
            }
        });

Работает отлично.

8
ответ дан 3 December 2019 в 22:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: