Теперь, когда вы опубликовали свой код, похоже, что вы используете плагин jquery form . Как объяснено в документации , этот плагин поддерживает загрузку файлов с использованием AJAX, но вы не можете вернуть JSON из серверного сценария:
Поскольку невозможно загружать файлы с помощью браузера
XMLHttpRequest объект, плагин формы использует скрытый элемент iframe для
помогите с задачей. Это обычная техника, но она присуща
ограничения. Элемент iframe используется как цель формы
операция отправки, которая означает, что ответ сервера записывается в
фрейм Это нормально, если тип ответа HTML или XML, но
не работает так же хорошо, если тип ответа - скрипт или JSON, оба
которые часто содержат символы, которые должны быть представлены с использованием объекта
ссылки, найденные в разметке HTML.
Чтобы учесть проблемы сценариев и ответов JSON, Форма
Плагин позволяет встраивать эти ответы в элемент textarea и
рекомендуется делать это для этих типов ответов при использовании в
соединение с загрузкой файлов. Обратите внимание, однако, что если есть
нет ввода файла в форме, тогда запрос использует обычный XHR для отправки
форма (не iframe). Это накладывает бремя на код вашего сервера на
знать, когда использовать текстовую область, а когда нет.
Таким образом, ваше действие контроллера загрузки должно отвечать:
<textarea>{"foo":"bar"}</textarea>
вместо:
{"foo":"bar"}
Также в этом случае не следует использовать тип содержимого ответа application/json
.
Вы можете написать собственный результат действия для достижения этого:
public class FileJsonResult : JsonResult
{
public FileJsonResult(object data)
: base()
{
Data = data;
JsonRequestBehavior = JsonRequestBehavior.AllowGet;
}
public override void ExecuteResult(ControllerContext context)
{
context.HttpContext.Response.Write("<textarea>");
base.ExecuteResult(context);
context.HttpContext.Response.Write("</textarea>");
context.HttpContext.Response.ContentType = "text/html";
}
}
и затем:
[HttpPost]
public virtual ActionResult StartImport(ImportModel model = null)
{
if (model != null)
{
var status = _importService.StartImport(model);
return new FileJsonResult(status);
}
new FileJsonResult(new { status = false, errorMessage = "The model was null" });
}
Теперь вам также может понадобиться адаптировать ваш обработчик успеха для удаления тегов <textarea>
:
$('#frmImport').ajaxForm({
success: function (responseHtml) {
var responseHtml = responseHtml
.replace(/\<textarea\>/i, '')
.replace(/\<\/textarea\>/i, '');
var response = $.parseJSON(responseHtml);
// do something with the response
}
});