9

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

[HttpPost]
public ActionResult Upload(IEnumerable<HttpPostedFileBase> fileUpload)

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

[HttpPost]
public ActionResult Upload(MyViewModel vm)

我希望发布此视图模型的原因是因为我认为它比使用 FormCollection 变量更干净,并且因为我希望上传的每个文件以及添加的数据及其关联的文本框List<FileUploadPacket>通过视图模型

更新

我的视图模型如下:

public class EmployeeVM  
{

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

    public List<FileUploadPacket> FileUploadPackets { get; set; }
}

具有 HttpPostedFileBase 类型属性的 FileUploadPacket 类

public class FileUploadPacket 
{

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

    public HttpPostedFileBase UpFile { get; set; }
}

我的 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 )%>

如您所见,我将特定于这个文件的所有其他属性都保存在它自己的类中。因此,在我的表格中,员工可以输入他的姓名并上传他的文件,并为每个文件提供一些描述和其他详细信息。如果我将公共HttpPostedFileBase UpFile { get; set; }属性移动到EmployeeVM类,那么我将不得不将所有文件分别收集到一个数组中,并手动将文件映射到它的描述。有没有办法将UpFile属性保留在FileUploadPacket类本身中?

我正在使用 aspx 视图引擎。

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

4

2 回答 2

12

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

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

定义视图模型

public class MyViewModel 
{
     public HttpPostedFileBase MyFile { get; set; }
}

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

<input type="file" id="MyFile" name="MyFile" />

和view,对应上传动作

@model MyViewModel

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

required 属性对于上传文件很重要。

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

于 2012-05-25T16:01:56.573 回答
3

解决此问题的方法是更改​​您命名和标识上传控件的方式。

<%: 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 )%>

这对我有用!希望它可以帮助其他人在那里..

于 2012-05-31T12:58:12.877 回答