2013-12-17 4 views
12

У меня есть некоторая проблема с отправкой formData методу действия на стороне сервера. Поскольку Ajax вызов не отправляет файлы на сервер, я должен добавить данные файла добавившего formData вручную, как это:Ajax FileUpload & JQuery formData в ASP.NET MVC

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

Я написал функцию JQuery, что нужно для отправки данных формы на сервер с помощью AJAX вызова. Это работает, но опубликовано formData на стороне сервера всегда null!

это мой сценарий:

<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> 

Edit 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); 
      } 
     } 

Edit 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 с панелью выполнения, перетаскивание и удаление Qq.FileUploader в Mvc 4 Razor] (http://www.jquery2dotnet.com/2012/09/ajax-multiple-file-upload-script-with.html) – Sender

ответ

21

Вместо JQuery Ajax вы можете использовать

<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'dont делает это именно для меня. Как добавить страницу успеха или ошибки в запрос 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]; 
     } 


    } 
Смежные вопросы