我对Aajx.BeginForm有一个非常奇怪的问题。我有这段代码:
在视图中:
[HttpPost]
[ValidateAntiForgeryToken]
public void Upload(IEnumerable<HttpPostedFileBase> files)
{
if (files != null)
{
foreach (var file in files)
{
// Verify that the user selected a file
if (file != null && file.ContentLength > 0)
{
// extract only the fielname
var fileName = Path.GetFileName(file.FileName);
// TODO: need to define destination
var path = Path.Combine(Server.MapPath("~/Upload"), fileName);
file.SaveAs(path);
}
}
}
}
在控制器中:
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.js"></script>
<script src="http://malsup.github.com/jquery.form.js"></script>
问题是我在提交表单时得到空文件。我读了许多与我的问题相同的问题,但大多数答案都是输入类型的名称=&#34; file&#34;与控制器中的参数名称不同。我找到了一些例子,我尝试this one,除了jquery文件之外几乎和我的代码相同,所以我尝试用这些文件替换jquery文件:
true
这是惊喜!!提交表单时,我会收到文件,但表单会回发。这是工作,因为没有ajax。我在谷歌搜索Ajax.BeginFrom,它回发并在stackoverflow中找到了许多解决方案,大多数答案是 jquery.unobtrusive-ajax 文件必须包含在页面中。它就像一堆问题,一旦你解决了一个问题就会得到另一个问题。我错过了什么吗?
答案 0 :(得分:2)
您无法使用Ajax.BeginForm()
提交文件。帮助程序使用jquery.unobtrusive-ajax.js
文件使用不允许multipart/form-data enctype
的ajax函数提交数据。
一种选择是使用FormData(但旧浏览器不支持)。将Ajax.BeginForm()
更改为Html.BeginForm()
,然后处理表单提交事件
$('form').submit(function() {
var formdata = new FormData($('form').get(0));
$.ajax({
url: '@Url.Action("YourActionName", "YourControllerName")',
type: 'POST',
data: formdata,
processData: false,
contentType: false,
success: function() {
.... // do something?
}
});
});
此外,还有许多jquery插件可用于上传文件(其中14个列出here)
附注:您的文件输入只允许选择一个文件,因此您的方法参数应为HttpPostedFileBase files
(不是IEnumerable<HttpPostedFileBase> files
),或者在文件输入中包含multiple
属性
答案 1 :(得分:0)
您需要在表单中指定编码类型。
@using (Ajax.BeginForm("Upload", "ControllerName", new AjaxOptions { HttpMethod = "POST"}, new { enctype = "multipart/form-data"}))
{
@Html.AntiForgeryToken()
<input type="file" name="files"><br>
<input type="submit" value="Upload File to Server">
}