Как запретить IE сохранять файл диалога при использовании fileupload в asp.net mvc - PullRequest
4 голосов
/ 23 февраля 2012

Когда я пытаюсь загрузить файл с помощью ASP.NET MVC, он отлично работает в FF && Chrome, но в IE и Opera появляется диалоговое окно, в котором предлагается либо загрузить, сохранить или отменить.

Выбор любой из опций запрещает загрузку файла.Как я могу обойти эту проблему?

 public class ImportModel
    {                     
        [Required]
        [FileExtensions("csv", ErrorMessage = "Please upload a valid .csv file")]
        public HttpPostedFileBase File { get; set; }
    }



[HttpPost]
    public virtual ActionResult StartImport(ImportModel model = null)
    {
        if (model != null)
        {
            var status = _importService.StartImport(model);
            return Json(status, JsonRequestBehavior.AllowGet);
        }
        return null;
    }

Просмотреть код ниже (суммировано):

<div id="dlgImport" class="hidden">

        @using (Html.BeginForm(MVC.Import.StartImport(), FormMethod.Post, new { @class = "smallForm", id = "frmImport", enctype = "multipart/form-data" }))
        {            
            <div class="fields-inline">
                <div class="editor-label">
                    @Html.Label("File")
                </div>
                <div class="editor-field">
                    @Html.TextBoxFor(x => x.File, new { @class="input-file", type = "file" })
                    @Html.ValidationMessageFor(x => x.File)
                </div>              
            </div>
        }
    </div>

</div>



$(function() {
        $("#frmImport").ajaxForm({
            success: function (responseHtml) {
                // response is wrapped in pre tags by the browser - the ajax upload is carried out using an iframe                                                
                var response = $.parseJSON($(responseHtml).text());
            }
        });
});


 var vm = {

        startImport: function () {

            if ($("#frmImport").valid()) {                
                $("#frmImport").submit();
            }
        }

    }

Ответы [ 2 ]

13 голосов
/ 24 февраля 2012

Теперь, когда вы опубликовали свой код, похоже, что вы используете плагин 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
    }
});
0 голосов
/ 02 июня 2014

У меня была та же проблема с IE8, и этот ответ мне очень помог. Но мне нужно было внести некоторые изменения, которые очень хорошо работали в IE8, Chrome и Firefox.

Следуйте изменениям ниже:

success: function (responseText) {
    try{
        var response = $.parseJSON(responseText);
        //code ...
    }    
    catch(ex) {
        //error code
    }
}

[HttpPost]
public JsonResult Upload(HttpPostedFileBase file) {
    //code
    return Json(new { Success = "true", Message = "Done!" }, "text/html");
}
...