2012-05-25 94 views
6

我有一個表單,我在上傳多個文件,並且有幾個文本框和一些與每個上傳文件相關的複選框。 上傳多個文件,我已經看到了例子,其中的ActionResult簽名是這樣的:綁定到Viewmodel的文件上傳

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

但是,我無法找到我在哪裏可以有多個文件上傳在我的ActionResult的簽名是這樣的任何例子:

[HttpPost] 
public ActionResult Upload(MyViewModel vm) 

我想要發佈這個viewmodel的原因是因爲我認爲它比使用FormCollection變量更清潔,並且因爲我想要將每個文件上傳並將數據與相關聯的文本框一起添加爲一組List<FileUploadPacket>哪會p下面

我的視圖模型視圖模型

更新的藝術:

public class EmployeeVM 
{ 

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

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

其中有型HttpPostedFileBase我的觀點的

public class FileUploadPacket 
{ 

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

    public HttpPostedFileBase UpFile { get; set; } 
} 

代碼段的屬性的FileUploadPacket類。 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視圖引擎。

請幫忙。感謝您的時間...

回答

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

這對我有效!希望它可以幫助其他任何人..

4

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

'enctype =「multipart/form-data」'部分爲我解決了它。 –