Asp.net mvc 绑定到Viewmodel的文件上载

Asp.net mvc 绑定到Viewmodel的文件上载,asp.net-mvc,file-upload,viewmodel,Asp.net Mvc,File Upload,Viewmodel,我有一个上传多个文件的表单,其中有几个文本框和一些复选框与每个上传的文件关联。 我见过上传多个文件的示例,其中actionresult签名如下: [HttpPost] public ActionResult Upload(IEnumerable<HttpPostedFileBase> fileUpload) 我希望发布此viewmodel的原因是,我认为它比使用FormCollection变量更干净,而且我希望上载的每个文件以及添加的数据及其关联的文本框通过列表组合在一起,该列表将

我有一个上传多个文件的表单,其中有几个文本框和一些复选框与每个上传的文件关联。 我见过上传多个文件的示例,其中actionresult签名如下:

[HttpPost]
public ActionResult Upload(IEnumerable<HttpPostedFileBase> fileUpload)
我希望发布此viewmodel的原因是,我认为它比使用FormCollection变量更干净,而且我希望上载的每个文件以及添加的数据及其关联的文本框通过
列表
组合在一起,该列表将成为viewmodel的一部分

更新

我的视图模型如下:

public class EmployeeVM  
{

    public int EmployeeID {get ;set;}
    public string EmpName {get ;set;}
    //Other properties

    public List<FileUploadPacket> FileUploadPackets { get; set; }
}
my view.aspx的代码片段如下

<%: 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 )%>
model.EmpName,新的{maxLength=50})%>
在此处上载您的文件:
model.FileUploadPackets[0]。UserEnteredDesc)%%>
model.FileUploadPackets[1]。UserEnteredDesc)%%>
正如您所看到的,我将上传的文件的所有其他属性保存在它自己的类中。因此,在我的表单中,员工可以输入自己的姓名,上传自己的文件,并为每个文件提供一些描述和其他详细信息。如果我将public
HttpPostedFileBase UpFile{get;set;}
属性移动到
EmployeeVM
类,那么我必须在数组中分别收集所有文件,并手动将文件映射到其描述。将
UpFile
属性保留在
FileUploadPacket
类本身中,是否无法执行此操作

我正在使用aspx查看引擎


请帮忙。感谢您抽出时间…

GetHtml
帮助程序不是mvc框架的一部分,您应该查找包含该帮助程序的第三方库

不过,上传作为ViewModel一部分的文件很简单。基本上是这样的

定义视图模型

public class MyViewModel 
{
     public HttpPostedFileBase MyFile { get; set; }
}
视图/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" />
}
@model MyViewModel
@使用(Html.BeginForm(“Upload”,“MyController”,FormMethod.Post,new{enctype=“multipart/formdata”})
{
@Html.EditorForModel()
}
“必需”属性对于上载文件很重要


就是这样,表单提交后,您应该会在
[HttpPost]
操作中看到上载的文件,
vm.MyFile

对此的修复正在更改您命名和标识上载控件的方式

<%: 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 )%>
model.EmpName,新的{maxLength=50})%>
在此处上载您的文件:
model.FileUploadPackets[0]。UserEnteredDesc)%%>
model.FileUploadPackets[1]。UserEnteredDesc)%%>

这对我有用!!希望它能帮助其他人。

突出显示+1 enctype=“multipart/form data”部分为我解决了这个问题。注意:对于VS2019/NET48,id语法已更改,而不是指定
@model MyViewModel

@using(Html.BeginForm("Upload", "MyController", FormMethod.Post, new { enctype="multipart/form-data"})
{
     @Html.EditorForModel()
    <input type="submit" value="Upload" />
}
<%: 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 )%>