2013-06-11 34 views
8

Tôi đang cố tải lên tệp bằng Ajax.BeginForm() nhưng không hoạt động.không thể tải tệp lên bằng cách sử dụng Ajax.BeginForm() không đồng bộ

Xem My Chứa:

@using (Ajax.BeginForm("UploadFile", null, new AjaxOptions { HttpMethod="POST",  UpdateTargetId = "result" }, new { enctype = "multipart/form-data" })) 
{   
    <label id="lblUploadNewFile" for="fileUploadControl">Upload New File&lt;/label>  
    <input type="file" name="fileToUpload" id="fileUploadControl"/> 
    <input id="btnFileUpload" type="submit" value="Upload" /> 
    <span id="result" />    
} 

và điều khiển tương ứng là:

[HttpPost] 
public string UploadFile(FormCollection formData) 
{ 
    HttpPostedFileBase file=null; 

    try 
    { 
     file = Request.Files[0]; 
    } 
    catch { } 

    if (file!=null &amp;&amp; file.ContentLength &gt; 0) 
    { 
     file.SaveAs(string.Concat(
      AppDomain.CurrentDomain.BaseDirectory, 
      Path.GetFileName(file.FileName))); 

     return &quot;Successfully Uploaded&quot;; 
    } 
    else 
    { 
     return &quot;Upload Failed, please try again.&quot;; 
    } 
} 

Vấn đề là nó tải lên các tập tin nhưng không còn làm bất kỳ bài viết không đồng bộ khi tôi loại bỏ jquery.unobtrusive-ajax.js. Thay vào đó, nó hoàn toàn trả sau.

Khi tôi thêm jquery.unobtrusive-ajax.js theo quan điểm của tôi, nó hoạt động không đồng bộ nhưng không gửi tệp tải lên trong dữ liệu biểu mẫu. Không có tệp nào được gửi tới máy chủ trong Request.Files[].

+1

Đó là không thể với Ajax vì những lý do rõ ràng: bạn có thể xây dựng một chiếc mũ trang tải lên bất kỳ tập tin truy cập trên các du khách hệ thống tập tin đến máy chủ mà không nói với anh ta. – Robert

Trả lời

14

Bạn không thể tải tệp lên bằng AJAX. Điều này không được hỗ trợ. Nếu bạn muốn thực hiện điều đó, bạn có thể sử dụng một số plugin tải tệp lên như Uploadify hoặc Blueimp File Upload hoặc sử dụng HTML 5 File API nếu trình duyệt của khách hàng hỗ trợ plugin đó.

+0

cảm ơn Darin vì câu trả lời của bạn, tôi sẽ thử triển khai Blueimp khi Uploadify yêu cầu flash. –

+0

Tôi đang sử dụng jQuery-asyncUpload được chia sẻ bởi steven: http://blog.stevensanderson.com/2008/11/24/jquery-ajax-uploader-plugin-with-progress-bar/ –

+0

@Darin Dimitrov, tôi không không hiểu câu trả lời của bạn. Theo [câu hỏi StackOverflow khác] này (http://stackoverflow.com/questions/19042116/ajax-beginform-in-mvc-to-upload-files), việc tải lên tệp thực sự được hỗ trợ và cách thực hiện nó được đưa ra trong câu trả lời khác. Bạn có thể làm rõ những gì bạn nói lên không? –

9

Bạn có thể thực hiện việc này mà không cần thêm thư viện.

Tôi đã xem qua ít hack này, mà giải quyết nó độc đáo

window.addEventListener("submit", function (e) { 
    var form = e.target; 
    if (form.getAttribute("enctype") === "multipart/form-data") { 
     if (form.dataset.ajax) { 
      e.preventDefault(); 
      e.stopImmediatePropagation(); 
      var xhr = new XMLHttpRequest(); 
      xhr.open(form.method, form.action); 
      xhr.onreadystatechange = function() { 
       if (xhr.readyState == 4 && xhr.status == 200) { 
        if (form.dataset.ajaxUpdate) { 
         var updateTarget = document.querySelector(form.dataset.ajaxUpdate); 
         if (updateTarget) { 
          updateTarget.innerHTML = xhr.responseText; 
         } 
        } 
       } 
      }; 
      xhr.send(new FormData(form)); 
     } 
    } 
}, true); 

Tìm thấy http://www.acnenomor.com/1762557p1/c-mvc3-ajaxbeginform-to-upload-file-not-working

+1

'http: // www.acnenomor.com/1762557p1/c-mvc3-ajaxbeginform-to-upload-file-not-working' không còn nữa; nó là một trang web sao chép scraper Stack Overflow, bạn thực sự tìm thấy [bài đăng này] (https://stackoverflow.com/questions/14972470/c-sharp-mvc3-ajax-beginform-to-upload-file-not-working). –

+1

bất cứ ai bạn sẽ tìm thấy bạn và yêu bạn! –

+0

Nhưng làm cách nào để thực hiện cuộc gọi lại cho biểu mẫu? –

Các vấn đề liên quan