2013-02-20 49 views
2

点击提交按钮后。我在实体中变为null。 有没有人有解决方案?c#MVC3 ajax.beginform上传文件不起作用

查看

@using (Ajax.BeginForm("CreateRoom", "Room", new AjaxOptions { HttpMethod = "POST", OnComplete = "window.location.href='Index'" }, new { enctype = "multipart/form-data", id = "ajaxUploadForm" })) 
    { 
     <input type="file" name="Room" /> 
     <input type="submit" value="OK" /> 
    } 

控制器

[HttpPost] 
    public ActionResult CreateRoom(RoomFileView entity) 
    { 
     //code 
    } 

模型

 public class RoomFileView 
    { 
     public RoomFileView(); 

     public int BuildingId { get; set; } 
     public int CityId { get; set; } 
     public int CountryId { get; set; } 
     public int FloorId { get; set; } 
     public int LocationId { get; set; } 
     public HttpPostedFileWrapper Room { get; set; } 

     public string Content(); 
    } 
+0

尝试为的Html.Form,并删除的onComplete ATTR。如果这有效,那么它是一个微妙的。如果不是,它的大东西我们还没有看到... – 2013-02-20 05:17:10

+1

尝试使用'Html.BeginForm'而不是'Ajax.BeginForm' – 2013-02-20 07:01:32

回答

5

您不能上传使用AJAX的文件。使用正式的Html.BeginForm。请查看此链接click here,因为这对您有所帮助。

如果您想使用异步上传,您可以尝试一些可用的上传组件,如Ajax Upload和Uploadify。

+0

另一种解决方案(但没有那么简单)是将图像转换为base64字符串,然后解码它在服务器上。 – 2013-02-20 14:24:09

+0

我发现这个相关的响应很有用:https://stackoverflow.com/a/23508202/6095334 – Hervian 2017-11-26 21:04:51

0

您无法使用AJAX.Beginform上传文件。
有许多第三方js控件可用。
但我没有发现它们非常有用。
要么你必须使用或使用Html.Beginform

8

我写了一个小黑客。它在大多数浏览器中工作正常,但在IE中不支持FormData对象。您可以将此代码添加到您自定义的js文件或html页面。

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

辉煌。不知道什么“但IE中不支持FormData对象”试图说,但我需要这个黑客Firefox的工作,以及IE。尚未在Chrome中进行测试。 – 2015-05-12 10:33:13

+0

原来这打破了Request.IsAjaxRequest()服务器端,所以它不会意识到这是一个Ajax请求了。你有没有想法如何解决@Aleksey? – 2015-05-12 13:44:14

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

即时通讯使用此脚本,但在OnBegin和OnSuccess的AjaxOptions中定义的函数不会运行... – Diego 2017-02-16 19:13:17