使用formdata追加@ HTML.BeginForm而不调用ajax

Gwn*_*wny 11 javascript forms asp.net asp.net-mvc jquery

我想要实现的是将一个文件追加到一个帖子请求,这是我从一个带有javascript的拖放字段获得的.问题是,我不想读取所有输入字段并通过ajax调用发布数据,我想使用默认的提交方法@HTML.BeginForm.当我这样做时,multipart并不真正包含该文件.

(注意:当我提交文件或手动读取所有输入字段并使用单独的ajax提交时,它可以正常工作.)

我的代码:拖放js:

var file;
var isDragged = false;
var formData;
function dropHandler(ev) {
    isDragged = true;
    ev.preventDefault();
    // Use DataTransfer interface to access the file(s)
    for (var i = 0; i < ev.dataTransfer.files.length; i++) {
        file = ev.dataTransfer.files[i];

        formData = new FormData($("#form"));
        formData.append("File.PayLoad", file);
        formData.append("File.FileMetadataId", $('#File_FileMetadataId').val())
        formData.append("File.FileObjectId", $('#File_FileObjectId').val())      
   }
}
Run Code Online (Sandbox Code Playgroud)

HTML:

  @using (Html.BeginForm("Edit", "DocumentTemplates", FormMethod.Post, new { role = "form", enctype = "multipart/form-data", id = "form" }))
    {
     @Html.AntiForgeryToken()
     <div class="row">
         <div class="col-xs-4">
             @Html.LabelFor(model => model.Language)
         </div>
         <div class="col-xs-8">
             @Html.HiddenFor(model => model.Language) @Html.DisplayFor(model => model.Language)
         </div>
     </div>
     <div class="row">
         <div class="col-xs-8">
             @Html.TextBoxFor(model => model.File.Payload, new { type = "file", @id = "browseFile", ondrop = "dropHandler(event);", ondragover = "dragOverHandler(event);" }) 
             @Html.ValidationMessageFor(model => model.File.Payload, null, new { @class = "text-danger" }) or Drag & Drop a File.
         </div>
     </div>
    }
Run Code Online (Sandbox Code Playgroud)

在Fiddler中请求空文件名:

-----------------------------7e27b381715d4
Content-Disposition: form-data; name="File.FileMetadataId"

44
-----------------------------7e27b381715d4
Content-Disposition: form-data; name="File.FileObjectId"

44
-----------------------------7e27b381715d4
Content-Disposition: form-data; name="File.Payload"; filename=""
Content-Type: application/octet-stream


-----------------------------7e27b381715d4--
Run Code Online (Sandbox Code Playgroud)

更新:我发现,你可以覆盖文件输入中的文件,但只能在Chrome中.因为我需要它在IE 11上工作,这对我没有帮助,但也许它可以帮助别人.您不需要附加所有表单字段,只需将输入类型文件设置为已删除的文件并提交...

Ali*_*ani 3

你那里有几个问题。问题之一是下面的代码。}您的代码中漏掉了一个。

如果你像下面这样写,那么最后存储的值file是不正确的。

for (var i = 0; i < ev.dataTransfer.files.length; i++) {
        file = ev.dataTransfer.files[i];
} // missing }
Run Code Online (Sandbox Code Playgroud)

如果你像下面这样写,那么最后存储的值formData是不正确的。

function dropHandler(ev) {
    isDragged = true;
    ev.preventDefault();
    // Use DataTransfer interface to access the file(s)
    for (var i = 0; i < ev.dataTransfer.files.length; i++) {
        file = ev.dataTransfer.files[i];

    formData = new FormData($("#form"));
    formData.append("File.PayLoad", file);
    formData.append("File.FileMetadataId", $('#File_FileMetadataId').val());
    formData.append("File.FileObjectId", $('#File_FileObjectId').val());    
   }
} // missing }
Run Code Online (Sandbox Code Playgroud)

第二个问题是ev.dataTransfer.files正如您在文件拖放中所看到的,最好检查一下ev.dataTransfer.items,有时它包含您的文件并且ev.dataTransfer.files是空的。

最后,你可以这样做:

function dropHandler(ev) {
    isDragged = true;
    ev.preventDefault();    

    formData = new FormData($("#form"));

    if (ev.dataTransfer.items) {
        // Use DataTransferItemList interface to access the file(s)
        for (var i = 0; i < ev.dataTransfer.items.length; i++) {
            // If dropped items aren't files, reject them
            if (ev.dataTransfer.items[i].kind === 'file') {
                var file = ev.dataTransfer.items[i].getAsFile();
                formData.append("File.PayLoad" + i, file);
            }
        }
    } else {
        // Use DataTransfer interface to access the file(s)
        for (var i = 0; i < ev.dataTransfer.files.length; i++) {
            file = ev.dataTransfer.files[i];
            formData.append("File.PayLoad" + i, file);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)