无法异步使用Ajax.BeginForm()上传文件

我正在尝试使用Ajax.BeginForm()上传文件,但它没有用完。

我的观点包含:

@using (Ajax.BeginForm("UploadFile", null, new AjaxOptions { HttpMethod="POST", UpdateTargetId = "result" }, new { enctype = "multipart/form-data" })) {  

和相应的控制器是:

 [HttpPost] public string UploadFile(FormCollection formData) { HttpPostedFileBase file=null; try { file = Request.Files[0]; } catch { } if ( file!=null && file.ContentLength > 0) { file.SaveAs(string.Concat( AppDomain.CurrentDomain.BaseDirectory, Path.GetFileName(file.FileName))); return "Successfully Uploaded"; } else { return "Upload Failed, please try again."; } } 

问题是它正在上传文件,但是当我删除jquery.unobtrusive-ajax.js时不再进行任何异步发布。 相反,它做了一个完整的回发。

当我在视图中添加jquery.unobtrusive-ajax.js时,它正在异步执行,但它不是在表单数据中发送上传文件。 在Request.Files[]没有文件被发送到服务器。

您无法使用AJAX上传文件。 这不受支持。 如果你想这样做,你可以使用一些文件上传插件,如Uploadify或Blueimp文件上传,或者如果客户端浏览器支持它,则使用HTML 5 File API

没有其他库,您可以执行此操作。

我遇到了这个小小的黑客,很好地解决了这个问题

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

找到http://www.acnenomor.com/1762557p1/c-mvc3-ajaxbeginform-to-upload-file-not-working

你可以这样做:从nuget获取jquery.form库并将其导入你的cshtml文件。你应该用@ Html.BeginForm创建你的表单。 然后您的表单底部将此脚本写入ajax-ify您的表单:

 $(function(){ $('#formId').ajaxForm({ complete:function(xhr){...}, success:function(){...}, error: function(){...} }); }); 

通过这些步骤,您可以将文件传递给控制器​​。