转载

MVC 5.0(or5.0↓) Ajax.BeginForm 异步上传附件问题,答案是不能的!

MVC 5.0(or5.0↓)  Ajax.BeginForm 异步 上传 附件 问题,答案是不能的!

(请注意我这里说的异步!)

来看一下下面这段一步提交file的代码

//前台 .cshtml 文件

<script src="~/jquery.unobtrusive-ajax.js"></script>
@using (Ajax.BeginForm("upLoadAsync", "UploadFile", new AjaxOptions { HttpMethod = "Post", OnSuccess = "success"
}
, new { enctype = "multipart/form-data" }
)) {
<input type="file" id="fileupload" name="Upload" /> <input type="submit" value="上传" id="btn"> }

//C#代码

public string upLoadAsync()

{

HttpPostedFileBase file = Request.Files["Upload"];

HttpPostedFileBase file = Request.Files[0];

//其余代码省略

//......

}

当debug到这里,你们就发现不管是 Request.Files["Upload"]亦或是 Request.Files[0] 都不会取到文件流。

这就是我要说的,当使用Ajax.BeginForm(jquery.unobtrusive-ajax.js) 异步上传 是不可行的,因为文件流不会被C#代码读取

但是并不影响 Ajax.BeginForm(jquery.unobtrusive-ajax.js) 异步提交表单 的特性。

那我我们应该如何异步提交表单呢?

利用 $("#formID").ajaxSubmit({});这个方法 异步提交表单 并且 上传文件

//前台 .cshtml 文件
<script src="~/jquery.form.js"></script>

<form id="formID" method="post" enctype="multipart/form-data">

@Html.Hidden("yearNow1", @ViewBag.yearNow as string)//输入一些要提交表单的值

<input type="file" id="fileupload" name="Upload" />

<input type=" button " value="上传" id="btn">//这里用button代替submit

</form>

<script type="text/javascript">

 $("#btn").click(function () {
$("#formID").ajaxSubmit({ url: "@Url.Action("upLoadAsync", "UploadFile")"
, type: "post", success: function (data) { //...... }, error: function (aa) { alert(aa); } });
});

//C#代码

public string upLoadAsync()

{

HttpPostedFileBase file = Request.Files["Upload"];

HttpPostedFileBase file = Request.Files[0];

//其余代码省略

//......

}

当debug到这里,你们就发现不管是 Request.Files["Upload"]亦或是 Request.Files[0] 都可以取到文件流。

当controller返回值也可以成功进入seccess方法中。

请注意我代码中标红的位置,以防遗漏导致一直debug无果问题!

总结一下:

1、MV5 5.0中异步提交表单方法两种:Ajax.BeginForm(new AjaxOptions:post) 和 $("#formID").ajaxSubmit({})

2、MVC 5.0中异步提交表单上传文件一种:$("#formID").ajaxSubmit({})

正文到此结束
Loading...