文件上传绑定到Viewmodel

use*_*358 8 asp.net-mvc file-upload viewmodel

我有一个表单,我上传多个文件,有几个文本框和一些复选框与每个上传的文件相关联.我已经看到了上传多个文件的示例,其中actionresult签名是这样的:

[HttpPost]
public ActionResult Upload(IEnumerable<HttpPostedFileBase> fileUpload)
Run Code Online (Sandbox Code Playgroud)

但是,我无法找到任何可以上传多个文件的示例,其中我的actionresult签名是这样的:

[HttpPost]
public ActionResult Upload(MyViewModel vm)
Run Code Online (Sandbox Code Playgroud)

我想要发布这个视图模型的原因是因为我认为它比使用FormCollection变量更干净,因为我希望每个文件都被上传,并且添加的数据及其相关的文本框将通过List<FileUploadPacket>其中的一部分组合在一起视图模型

UPDATE

My View模型如下:

public class EmployeeVM  
{

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

    public List<FileUploadPacket> FileUploadPackets { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

FileUploadPacket类,其属性类型为HttpPostedFileBase

public class FileUploadPacket 
{

    public int FileID {get ;set;}
    public string UserEnteredDesc {get ;set;}
    //some more other properties

    public HttpPostedFileBase UpFile { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的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 )%>
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我将上传的这个文件的所有其他属性保存在自己的类中.因此,在我的表单中,员工可以输入他的姓名并上传他的文件,并为每个文件提供一些描述和其他详细信息.如果我将公共HttpPostedFileBase UpFile { get; set; }属性移动到EmployeeVM类中,那么我将必须在数组中单独收集所有文件并手动将文件映射到其描述.有没有办法保持班级本身的UpFile财产FileUploadPacket

我正在使用aspx视图引擎.

请帮忙.谢谢你的时间...

arc*_*hil 10

GetHtml helper不是mvc框架的一部分,你应该查找包含该帮助器的第三方库.

上传属于ViewModel的文件很简单.基本上就是这样的

定义视图模型

public class MyViewModel 
{
     public HttpPostedFileBase MyFile { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在里面Views/Shared/EditorTemplates,创造MyViewModel.cshtml

<input type="file" id="MyFile" name="MyFile" />
Run Code Online (Sandbox Code Playgroud)

并查看,对应上传动作

@model MyViewModel

@using(Html.BeginForm("Upload", "MyController", FormMethod.Post, new { enctype="multipart/form-data"})
{
     @Html.EditorForModel()
    <input type="submit" value="Upload" />
}
Run Code Online (Sandbox Code Playgroud)

必需属性对于上传文件很重要.

就是这样,一旦表单提交,你应该看到上传的文件在[HttpPost]行动中,vm.MyFile.

  • `enctype ="multipart/form-data"`部分为我解决了它. (6认同)

use*_*358 3

解决此问题的方法是更改​​上传控件的命名和 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 )%>
Run Code Online (Sandbox Code Playgroud)

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