我正在使用mvc3,我正在尝试创建一系列ajax表单,每个表单都在一个页面中上传文件。这是该页面的视图:
@{
ViewBag.Title = "Index";
}
<h2>
Index</h2>
@Html.Partial("_UploadItem")
@Html.Partial("_UploadItem")
@Html.Partial("_UploadItem")
<script type="text/javascript">
function Go() {
// loop through form tags
for (var n = 0; n < document.forms.length; n++) {
var f = document.forms[n];
// if a dress is chosen, a caption is chosen
// and a file is chosen, then submit the ajax form
if (f.dressid.value != '' &&
f.dresscaption.value != '' &&
f.fileitem.value != '')
f.submit();
}
}
</script>
<input type="button" onclick="Go();"/>
然后Go()函数循环遍历ajax表单,检查每个表单上的所有3个部分(dressid,dresscaption和fileitem)是否为非空,并且调用提交表单,启动异步上传。
以下是部分视图:
@using SoRefeising.Models
@using (Ajax.BeginForm("UploadFile", new { }, new AjaxOptions { HttpMethod = "POST" }, new { enctype="multipart/form-data"}))
{
List<SelectListItem> items = (List<SelectListItem>)ViewBag.Dresses;
<span>Dress</span>
@Html.DropDownList("dressid", items, "Choose Dress");
<span>Caption</span>
@Html.TextBox("dresscaption")
<input type="file" id="fileitem" />
}
我已使用multipart属性标记每个表单。生成页面时,我得到以下内容:
<form action="/upload/UploadFile" data-ajax="true" data-ajax-method="POST" enctype="multipart/form-data" id="form0" method="post"> <span>Dress</span>
<select id="dressid" name="dressid"><option value="">Choose Dress</option>
<option value="1">Simpson01</option>
<option value="2">Simpson02</option>
</select> <span>Caption</span>
<input id="dresscaption" name="dresscaption" type="text" value="" /> <input type="file" id="fileitem" />
</form>
<form action="/upload/UploadFile" data-ajax="true" data-ajax-method="POST" enctype="multipart/form-data" id="form1" method="post"> <span>Dress</span>
<select id="dressid" name="dressid"><option value="">Choose Dress</option>
<option value="1">Simpson01</option>
<option value="2">Simpson02</option>
</select> <span>Caption</span>
<input id="dresscaption" name="dresscaption" type="text" value="" /> <input type="file" id="fileitem" />
</form>
<form action="/upload/UploadFile" data-ajax="true" data-ajax-method="POST" enctype="multipart/form-data" id="form2" method="post"> <span>Dress</span>
<select id="dressid" name="dressid"><option value="">Choose Dress</option>
<option value="1">Simpson01</option>
<option value="2">Simpson02</option>
</select> <span>Caption</span>
<input id="dresscaption" name="dresscaption" type="text" value="" /> <input type="file" id="fileitem" />
</form>
一切看起来都不错......
这是名为
的控制器操作[HttpPost]
public ActionResult UploadFile(string dressid, string dresscaption)
{
HttpPostedFileBase hpf = Request.Files[0] as HttpPostedFileBase;
...
调用操作时,Request.Files集合有0个项目,而不是所选文件。我启用了不显眼的javascript,不显眼的文件加载到母版页中,并在其他页面上工作。
我在论坛上看到一些关于小心文件大小的消息。我正在测试的文件是&lt; 2K
为什么Request.Files中没有项目的任何想法?
由于
答案 0 :(得分:9)
您无法使用AJAX上传文件。因此,将Ajax.BeginForm
替换为普通Html.BeginForm
。您也可以结帐following blog post。
如果您想使用异步上传,可以尝试使用一些可用的上传组件,例如Ajax Upload和Uploadify。
答案 1 :(得分:0)
首先,我不确定你为什么会这样做三次。
@Html.Partial("_UploadItem")
@Html.Partial("_UploadItem")
@Html.Partial("_UploadItem")
您是否尝试上传多个文件?有很多脚本可以让你非常有效地完成这项工作。您还使用包含相同ID的字段生成多个表单。这不会影响上传过程,但这是不好的做法。我认为你需要重构上述内容。无论如何,将局部视图中的字段更改为
<input type="file" name="file" />
我认为问题可能在于您的实际操作以及您尝试检索文件的方式。试试这个
HttpPostedFileBase postedFile = Request.Files["file"];
如果有效,请告诉我。