文件上传绑定到Viewmodel

时间:2012-05-25 15:52:09

标签: asp.net-mvc file-upload viewmodel

我有一个表单,我上传多个文件,并且有几个文本框和一些与上传的每个文件相关联的复选框。 我已经看到了上传多个文件的示例,其中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视图引擎。

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

2 个答案:

答案 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 )%>

这对我有用!!希望它可以帮助其他任何人..