2

サーバーにファイルをアップロードしようとしていますが、フォームを送信するときにActionResultを呼び出しません。Chrome、FF では動作しますが、IE では動作しません。IE のフォームからenctype ="multipart/form-data"属性を削除すると、メソッドが呼び出されますが、ファイルのアップロードは行われません...

私はそのような入力を持っています:

<input id="jqueryfileupload" type="file" name="files" data-upload-id="@documentUniqueId"
data-url="@Url.Action(MVC.Profile.Documents().AddRouteValue("documentUniqueId", documentUniqueId))" multiple>

jQuery コード:

$(document).on('change', '.documents-upload-container #jqueryfileupload', function (e) {
        e.preventDefault();
        e.stopPropagation();
        var $this = $(this);
        //input itself is not in the form tag, so i am creating form here and  
        //submitting it this way
        var formContainer = $('<form action="' + $this.data('url') + '" enctype="multipart/form-data" method="POST"></form>');
        $this.appendTo(formContainer);
        var contentTypeOption = $.browser.msie ? 'text/html' : 'application/json';
        var iframeOption = $.browser.msie ? true : false;
        var options = {
            dataType: 'json',
            //contentType: contentTypeOption,
            //iframe: iframeOption,
            method: 'POST',
            success: function (response, textStatus, xhr, form) {
                alert(response);
            },
            error: function (xhr, textStatus, errorThrown) {

                alert(xhr);
                alert(textStatus);
                alert(errorThrown);
            },
            clearForm: true
        };

        $(formContainer).ajaxSubmit(options);
        return false;
    });

エラーはなく、IE ではアラートがまったくスローされません。ただメソッドが呼び出されていません...

アクション方法:

[HttpPost]
public virtual ActionResult Documents(IEnumerable<HttpPostedFileBase> files, string documentUniqueId)
{
    var result = new ContentResult();
    if (files != null)
    {
        foreach (var item in files)
        {
            string docName = documentUniqueId + "_" + item.FileName;
            var filename = Path.Combine(Server.MapPath("~/App_Data"), docName);
            item.SaveAs(filename);
        }

        var docs = files.Select(x => new
        {
            url = Url.Action(MVC.Profile.Documents(documentUniqueId + "_" + x.FileName, x.ContentType)),
            name = x.FileName,
            contentType = x.ContentType,
            id = documentUniqueId + "_" + x.FileName
        });

        result.Content = new JavaScriptSerializer().Serialize(docs);
        return result;
    }
    result.Content = new JavaScriptSerializer().Serialize(new { success = false });
    return result;
}

[HttpGet]
public virtual ActionResult Documents(string fileName, string contentType)
{
    var docPath = Path.Combine(Server.MapPath("~/App_Data"), fileName);
    return File(docPath, contentType);
}

私はこのプラグインを使用します: http://malsup.com/jquery/form/

4

1 に答える 1