Ajax.BeginForm没有按预期工作

时间:2015-08-18 21:17:28

标签: asp.net asp.net-mvc asp.net-ajax ajax.beginform

我对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 文件必须包含在页面中。它就像一堆问题,一旦你解决了一个问题就会得到另一个问题。我错过了什么吗?

2 个答案:

答案 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">
    }
相关问题