无法使用IEnumerable <httppostedfilebase> </httppostedfilebase>上传多个文件

时间:2014-07-10 14:48:38

标签: c# asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

我有一个场景,用户选择上传4张图片,我需要将这四个文件绑定到我的模型并保存到文件夹中。但我遇到的问题是我的模型,当达到行动方法时它将为空。任何人都可以帮忙解决这个问题。

我的观点:

@using(@Html.BeginForm("fileUpload","Home",FormMethod.Post, new { enctype = "multipart/form-data"}))
{
<div>
    <h1>Auto Upload</h1>
</div>
<div>@Html.TextBoxFor(m => m.MyFile, new { id = "file1" , Type = "file" })</div>
<div>@Html.TextBoxFor(m => m.MyFile, new { id = "file2" , Type = "file" })</div>
<div>@Html.TextBoxFor(m => m.MyFile, new { id = "file3" , Type = "file" })</div>
<div>@Html.TextBoxFor(m => m.MyFile, new { id = "file4" , Type = "file" })</div>
<input type ="submit" name ="submit" />
}

我的模特:

public class MyModel
    {
        public IEnumerable<HttpPostedFileBase> MyFile { get; set; }
    }

控制器:当我在控制器的fileUpload方法中点击提交时,我得到files = null。

        [HttpPost]
        public void fileUpload(IEnumerable<HttpPostedFileBase> files)
        {
            string s = "upload";
        }

请帮助我,与平常工作相比,我对上传文件非常新。

1 个答案:

答案 0 :(得分:2)

您使用相同的名称但不同的ID显示相同的文本框四次,模型绑定器不知道您尝试发布名为files的集合。此处也不要使用TextBoxFor助手,在这种情况下使用普通的旧HTML元素没有任何问题。

@using (@Html.BeginForm("fileUpload", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    <label for="file1">File :</label>
    <input type="file" name="files" id="file1" />

    <label for="file2">File :</label>
    <input type="file" name="files" id="file2" />

    <label for="file3">File :</label>
    <input type="file" name="files" id="file3" />

    <label for="file4">File :</label>
    <input type="file" name="files" id="file4" />

    <input type="submit" value="Upload" />
}

然后您的控制器方法签名保持不变,但您会看到files集合已正确填充。

[HttpPost]
public void fileUpload(IEnumerable<HttpPostedFileBase> files)
{
    foreach (var file in files)
    {
        // Validate size (in bytes), set your limit accordingly
        if (file.ContentLength > 0  && file.ContentLength <= 2097152)
        {
            // Do something with your files
        }
    }
}

要记住的重要一点是,模型绑定基于给予表单元素的name属性。你使用它的方式,输入呈现类似<input name="MyFile">的内容,因此当发回服务器时,没有任何迹象表明它应该绑定到名为files的集合。