我有一个场景,用户选择上传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";
}
请帮助我,与平常工作相比,我对上传文件非常新。
答案 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
的集合。