У меня есть образцовая форма создания в направляющих, которые у меня также есть возврат 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
Хотя я не совсем то, что я стремился решить, я смог прийти к немного другому решению, которое соответствовало моим потребностям!
Поскольку загрузка файлов ajax выполняется через iframe, проблема заключалась в том, что после того, как iframe загрузил файл .json, Firefox интерпретировал его как загрузку, и было открыто приглашение загрузки. Я почти уверен, что мог бы поиграть с некоторыми настройками сервера, чтобы предотвратить это, но я уже потратил на это достаточно времени.
То, что я сделал, - это визуализация вывода в виде текста, а не json, потому что я все равно ловил только один номер id. Теперь мой код выглядит так:
$(document).ready(function() {
$('#continue-upload').click(function() {
$('#new_stem').ajaxSubmit({
dataType: 'text', //'json',
success: formSuccess
});
});
});
Нужный мне идентификатор также был заключен в предварительные теги, поэтому мне также нужно было убрать их в моей функции результатов.
Это делает то, что я хочу сейчас, у-у!
Вы отменяете действие по умолчанию события submit
? Похоже, что форма действительно отправляется (в классическом смысле - другими словами, Firefox действительно переходит на страницу, указанную в action
формы).
Звучит так, как будто его заголовок ответа Content-Type
неправильный, и поэтому браузер не знает, что с ним делать. Это должно быть application/json
. Вы можете использовать панель Firebug Net для детемина фактических заголовков ответов.
Этот плагин позволит вам отправлять 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
});
Может быть, это поможет
$('#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'}
Не очень хорошо, но работает
Чтобы браузер не запускал загрузку файла .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);
}
});
Работает отлично.