2013-12-17 60 views
12

我在将formData发布到服务器端操作方法时遇到了一些问题。由于AJAX调用不将文件发送到服务器,我有文件上传数据添加到formData手动像这样:ASP.NET MVC中的Ajax FileUpload&JQuery formData

var formData = new FormData(); 
formData.append("imageFile", $("#imageFile").file); 
formData.append("coverFile", $("#coverFile").file); 

我写了jQuery的功能需要使用Ajax调用表单数据发布到服务器。 它的工作,但在服务器端张贴formData始终为空!

这是我的脚本:

<script> 
     function SubmitButtonOnclick() 
     {  
      var formData = new FormData(); 
      formData.append("imageFile", $("#imageFile").file); 
      formData.append("coverFile", $("#coverFile").file); 

      $.ajax({ 
       type: "POST", 
       url: '@Url.Action("EditProfile", "Profile")', 
       data: formData, 
       dataType: 'json', 
       contentType: "multipart/form-data", 
       processData: false, 
       success: function (response) { 
        $('#GeneralSection').html(response.responseText); 
       }, 
       error: function (error) { 
        $('#GeneralSection').html(error.responseText); 
       } 
      }); 
     } 
    </script> 

编辑1: 这是在控制器的动作方法:

 public ActionResult EditProfile(ProfileGeneralDescription editedModel, 
           HttpPostedFileBase imageFile, 
           HttpPostedFileBase coverFile, 
           string postOwnerUser) 
     { 
      try 
      { 
       if (postOwnerUser == User.Identity.Name) 
       { 
       // edit codes...  
        var result = GetProfileGeneralDescription(postOwnerUser); 
        return PartialView("_GeneralProfile", result); 
       } 
       else 
       { 
        var error = new HandleErrorInfo(
        new Exception("Access Denied!"), 
        "Profile", 
        EditProfile 
        return PartialView("~/Views/Shared/Error.cshtml", error); 
       } 
      } 
      catch (Exception ex) 
      { 
       var error = new HandleErrorInfo(ex, "Profile", EditProfile 
       return PartialView("~/Views/Shared/Error.cshtml", error); 
      } 
     } 

编辑2: CSHTML视图文件内容:

@model Website.Models.ViewModel.Profile 

    @using (Ajax.BeginForm("EditProfile", "Profile", new { postOwnerUser = User.Identity.Name }, new AjaxOptions() 
    { 
     HttpMethod = "POST", 
     InsertionMode = InsertionMode.Replace, 
     UpdateTargetId = "GeneralSection" 
    }, new { enctype = "multipart/form-data" })) 
    { 

     <div> 
      <button id="btnSubmit" type="button" onclick="SubmitButtonOnclick()">Submit</button> 
     </div> 

     <input type="hidden" name="username" id="username" value="@Model.Username"/> 

     <fieldset> 
      <legend>Edit Photos</legend> 
      <div> 
       Select profile picture: 
       <input id="imageFile" type="file" name="imageFile" accept="image/png, image/jpeg" /> 
       @Html.CheckBoxFor(modelItem => modelItem.DefaultCover)<span>Remove profile photo</span> 
      </div> 
      <div> 
       Select cover picture: 
       <input id="coverFile" type="file" name="coverFile" accept="image/png, image/jpeg" /> 
       @Html.CheckBoxFor(modelItem => modelItem.DefaultCover)<span>RemoveCover</span> 
      </div> 
     </fieldset> 
    } 

任何提示,链接或代码示例都会很有用。
预先感谢您!

+0

你试过设置'contentType'到'FALSE'? – Knelis

+0

是的,但钢铁发送到服务器。 – Mojtaba

+0

[带有进度条的Ajax多文件上传脚本,在Mvc 4 Razor中拖放Qq.FileUploader](http://www.jquery2dotnet.com/2012/09/ajax-multiple-file-upload-script-with.html ) – Sender

回答

21

相反jQuery的阿贾克斯,你可以使用

<script> 
      function SubmitButtonOnclick() 
      { 
       var formData= new FormData(); 
       var imagefile=document.getElementById("imageFile").files[0]; 
       var coverfile=document.getElementById("coverFile").files[0]; 
       formData.append("imageFile",imageFile); 
       formData.append("coverFile",coverFile); 
       var xhr = new XMLHttpRequest(); 
       xhr.open("POST", "/Profile/EditProfile", true); 
       xhr.addEventListener("load", function (evt) { UploadComplete(evt); }, false); 
       xhr.addEventListener("error", function (evt) { UploadFailed(evt); }, false); 
       xhr.send(formData); 

      } 

     function UploadComplete(evt) { 
     if (evt.target.status == 200) 
       alert("Logo uploaded successfully."); 

     else 
       alert("Error Uploading File"); 
     } 

    function UploadFailed(evt) { 
     alert("There was an error attempting to upload the file."); 

    } 
</script> 

这对我的作品!

您与变化

function SubmitButtonOnclick() { 
     var formData = new FormData(); 
     var file = document.getElementById("imageFile").files[0]; 
     var file1 = document.getElementById("coverFile").files[0]; 
     formData.append("imageFile", $("#imageFile").file); 
     formData.append("coverfile", file1); 
     $.ajax({ 
      type: "POST", 
      url: '@Url.Action("EditProfile","Default1")', 
      data: formData, 
      dataType: 'json', 
      contentType: false, 
      processData: false, 
      success: function (response) { 
       $('#GeneralSection').html(response.responseText); 
      }, 
      error: function (error) { 
       $('#GeneralSection').html(error.responseText); 
      } 
     }); 
    } 
+0

感谢您的回答。我最后的代码和你的一样。但我需要将所有数据一起发布,并用当前的内容替换响应文本,XHR不会为我完成这些操作。如何将成功或错误页面添加到XHR请求? – Mojtaba

+0

如果成功,则调用'UploadComplete'函数。您可以使用该方法编写代码。如果上传失败,则'UploadFailed'函数被调用 – Nilesh

+0

我复制/粘贴你的代码到我的脚本部分,但它是钢发送空数据到服务器端功能。 (成功警报显示在客户端) – Mojtaba

1
<input type="file" id="picfile" name="picf" /> 
     <input type="text" id="txtName" style="width: 144px;" /> 
$("#btncatsave").click(function() { 
var Name = $("#txtName").val(); 
var formData = new FormData(); 
var totalFiles = document.getElementById("picfile").files.length; 

        var file = document.getElementById("picfile").files[0]; 
        formData.append("FileUpload", file); 
        formData.append("Name", Name); 

$.ajax({ 
        type: "POST", 
        url: '/Category_Subcategory/Save_Category', 
        data: formData, 
        dataType: 'json', 
        contentType: false, 
        processData: false, 
        success: function (msg) { 

           alert(msg); 

        }, 
        error: function (error) { 
         alert("errror"); 
        } 
       }); 

}); 

[HttpPost] 
    public ActionResult Save_Category() 
    { 
     string Name=Request.Form[1]; 
     if (Request.Files.Count > 0) 
     { 
      HttpPostedFileBase file = Request.Files[0]; 
     } 


    }