我有一个表单,我上传多个文件,并且有几个文本框和一些与上传的每个文件相关联的复选框。 我已经看到了上传多个文件的示例,其中actionresult签名是这样的:
[HttpPost]
public ActionResult Upload(IEnumerable<HttpPostedFileBase> fileUpload)
但是,我无法找到任何可以上传多个文件的示例,其中我的actionresult签名是这样的:
[HttpPost]
public ActionResult Upload(MyViewModel vm)
我希望发布此视图模型的原因是因为我认为它比使用FormCollection变量更干净,因为我希望每个文件都被上传,并且添加的数据及其相关文本框将通过{{组合在一起1}}将成为ViewModel的一部分
更新
我的观点模型如下:
List<FileUploadPacket>
FileUploadPacket类,其属性类型为HttpPostedFileBase
public class EmployeeVM
{
public int EmployeeID {get ;set;}
public string EmpName {get ;set;}
//Other properties
public List<FileUploadPacket> FileUploadPackets { get; set; }
}
我的view.aspx的代码段如下所示
public class FileUploadPacket
{
public int FileID {get ;set;}
public string UserEnteredDesc {get ;set;}
//some more other properties
public HttpPostedFileBase UpFile { get; set; }
}
正如您所看到的,我将上传的这个文件特有的所有其他属性保存在自己的类中。因此,在我的表单中,员工可以输入他的姓名并上传他的文件,并为每个文件提供一些描述和其他详细信息。如果我将公共<%: Html.TextBoxFor(model => model.EmpName, new { maxLength = 50 })%>
Upload your files here:
<input type="file" id="UpFile" name="UpFile" value="ActionHandlerForForm" />
<%: Html.TextBoxFor(model => model.FileUploadPackets[0].UserEnteredDesc )%>
<input type="file" id="UpFile" name="UpFile" value="ActionHandlerForForm" />
<%: Html.TextBoxFor(model => model.FileUploadPackets[1].UserEnteredDesc )%>
属性移动到HttpPostedFileBase UpFile { get; set; }
类,那么我将必须在数组中单独收集所有文件,并手动将文件映射到其描述。有没有办法保持EmployeeVM
类本身的UpFile
属性?
我正在使用aspx视图引擎。
请帮忙。谢谢你的时间......
答案 0 :(得分:10)
GetHtml
帮助程序不是mvc框架的一部分,您应该查找包含该帮助程序的第三方库。
上传属于ViewModel的文件很简单。基本上它就像这样
定义视图模型
public class MyViewModel
{
public HttpPostedFileBase MyFile { get; set; }
}
在Views/Shared/EditorTemplates
内,创建MyViewModel.cshtml
<input type="file" id="MyFile" name="MyFile" />
并查看,对应上传操作
@model MyViewModel
@using(Html.BeginForm("Upload", "MyController", FormMethod.Post, new { enctype="multipart/form-data"})
{
@Html.EditorForModel()
<input type="submit" value="Upload" />
}
必需属性对于上传文件很重要。
就是这样,一旦表单提交,您应该在[HttpPost]
操作vm.MyFile
内看到上传的文件。
答案 1 :(得分:2)
对此的修复正在改变上传控件的名称和ID的方式。
<%: Html.TextBoxFor(model => model.EmpName, new { maxLength = 50 })%>
Upload your files here:
<input type="file" id="FileUploadPackets[0].UpFile" name="FileUploadPackets[0].UpFile" value="ActionHandlerForForm" />
<%: Html.TextBoxFor(model => model.FileUploadPackets[0].UserEnteredDesc )%>
<input type="file" id="FileUploadPackets[1].UpFile" name="FileUploadPackets[1].UpFile" value="ActionHandlerForForm" />
<%: Html.TextBoxFor(model => model.FileUploadPackets[1].UserEnteredDesc )%>
这对我有用!!希望它可以帮助其他任何人..