【问题标题】:MVC5 controller not getting file from HTML file inputMVC5 控制器没有从 HTML 文件输入中获取文件
【发布时间】:2016-05-25 16:53:02
【问题描述】:

我试图简单地允许用户上传文件。

我有一个简单的开始表单,其中包含如下所示的文件元素:

 @using (Html.BeginForm("LoadData", "Input", FormMethod.Post, new { enctype = "multipart/form-data" }))
        { 
            <div style="width:23%; display:inline-block;">
                <label>Select Type:</label>
                <select name="UploadType">
                    <option value="First">First</option>
                    <option value="Second">Second</option>
                </select>
            </div>
            <div style="width:43%; display:inline-block;">
                <input type="file" name="files1" id="files1" />
            </div>
            <div style="width:33%; display:inline-block;">
                <input type="submit" value="Upload"/>
            </div>
        }

控制器是:

[HttpPost]
    public ActionResult LoadData(string UploadType, HttpPostedFileBase file1)
    {
        if(file1 != null && UploadType != null)
        {
            Console.WriteLine(file1.FileName);
            Console.WriteLine(UploadType);
        }
    }

一切都在网站上显示和工作,但当它回发时,文件为空。我查看了许多谷歌搜索结果,包括:

Binding HttpPostedFileBase using Ajax.BeginForm

MVC 4 Razor File Upload

http://www.aurigma.com/upload-suite/developers/aspnet-mvc/how-to-upload-files-in-aspnet-mvc

等等。他们都说我的东西是正确的。只要文件输入和控制器参数上的名称匹配,它就可以工作。但事实并非如此。

我尝试将其命名为 file、files,现在又命名为 file1,但无论我怎么称呼它,它都会返回 null。

我做错了什么?我什至尝试检查 Request.Files 但它的计数为 0。

【问题讨论】:

  • 我不明白这是如何被否决的。这个问题从来没有解决,只能解决。因此,没有理由的否决票是不必要的,尤其是当给出的唯一答案不起作用时。如果您有答案,我很乐意听到。

标签: html asp.net-mvc


【解决方案1】:

哇,这已经过时了,甚至没有给出正确的答案(对什么投反对票?)。

我现在已经找到了一个可行的答案。

对于遇到此问题的任何人,javascript 都是您的朋友。

我最终改用 javascript 来处理文件。这是工作代码:

Javascript(现在允许多个文件):

 function SendData() {
        var formData = new FormData(document.querySelector('UploadForm'));
        for(var i = 0; i < $('#file')[0].files.length; i++)
        {
            formData.append('files', $('#file')[0].files[i]);
        }

        formData.append('samplevalue', $('#samplevalue').val());

        var url = $('#baseUrl').val() + 'Input/LoadData';
        $.ajax({
            url: url,
            type: 'POST',
            data: formData,
            processData: false,  // tell jQuery not to process the data
            contentType: false,  // tell jQuery not to set contentType
            success: function (data) {
             // your logic....
            },
            error: function(data)
            {
                // logic....
            }
        });
    }

然后控制器接受

public string LoadData(string samplevalue, HttpPostedFileBase[] files)
{
}

当然,诀窍是 javascript。我仍然不知道为什么表单不能正常工作,但这工作得很好。 :)

【讨论】:

    【解决方案2】:

    您的文件输入名为files1,但您的操作参数为file1(不是s)。

    【讨论】:

    • 对不起。更新了还是不行。如前所述,无论名称如何,它都不会获取文件。
    • 这真的没什么。假设您渲染的form 标签实际上包含enctype="multipart/form-data"(在文档源中验证),并且字段名称与您的操作中的参数名称完全匹配,那么您就是黄金。
    • 那么只要你有一个HttpPostedFileBase 类型的参数,其名称完全 匹配文件输入的名称属性,它应该可以工作。如果不是,那么还有其他事情在起作用。究竟是什么,我不知道,但它与 MVC 无关,除非你做过一些愚蠢的事情,比如使用自定义模型绑定器。
    • 如果 AJAX 发送文件比常规表单更麻烦......因为 AJAX 需要解决方法
    • 是的,即便如此,它也仅在现代浏览器中受支持,因此根据您测试的内容,它可能始终为空。
    【解决方案3】:
        @using (Html.BeginForm("MethodName", "ControllerName", FormMethod.Post, 
    new { enctype = "multipart/form-data" }))
    {
      @Html.AntiForgeryToken()
      <input type="file" name="ImgUploader" id="ImgUploader" />
      <input type="submit" value="Create" class="btn btn-default" />
    }
    
    **Your Controller**`[HttpPost]
    public ActionResult Create()
    {
     HttpPostedFileBase file = Request.Files["ImgUploader"];
    }
    

    【讨论】:

    • 你可能应该在你的代码中添加一些解释
    猜你喜欢
    • 2015-10-04
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多