2012-05-25 13 views
6

Ich habe ein Formular, in dem ich mehrere Dateien hochlade, und jeder hochgeladenen Datei sind ein paar Textfelder und einige Kontrollkästchen zugeordnet. Ich habe für das Hochladen von mehreren Dateien gesehen Beispiele, bei denen die Action Signatur so etwas wie diese:Datei-Upload an das Viewmodel gebunden

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

Allerdings kann ich nicht jedes Beispiel finden, wo ich mehrere Dateien hochgeladen haben kann, wo meine Action Signatur so etwas wie diese:

Der Grund, warum ich dieses Viewmodel gepostet werden soll, ist, weil ich denke, es ist sauberer als mit der FormCollection-Variable und weil ich möchte jede Datei hochgeladen und die Daten zusammen mit den zugehörigen Textfeldern über eine gruppiert werden List<FileUploadPacket> welches wird p Kunst des Ansichtsmodell

UPDATE

My View-Modell unten:

public class EmployeeVM 
{ 

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

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

Die FileUploadPacket Klasse, die die Eigenschaft des Typs hat HttpPostedFileBase

public class FileUploadPacket 
{ 

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

    public HttpPostedFileBase UpFile { get; set; } 
} 

-Code-Snippet meiner Sicht. aspx wie unten

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

Wie Sie sehen können, habe ich alle anderen spezifischen Eigenschaften für diese eine Datei hochgeladen in seiner eigenen Klasse gehalten. So kann ein Mitarbeiter in meiner Form seinen Namen eingeben und seine Dateien hochladen und für jede Datei eine Beschreibung und andere Details angeben. Wenn ich die öffentliche HttpPostedFileBase UpFile { get; set; }-Eigenschaft in die Klasse EmployeeVM verschiebe, muss ich alle Dateien separat in einem Array sammeln und manuell eine Datei ihrer Beschreibung zuordnen. Gibt es keine Möglichkeit, dies zu tun, die UpFile Eigenschaft in der FileUploadPacket Klasse selbst zu halten?

Ich benutze die aspx-View-Engine.

Bitte helfen. Vielen Dank für Ihre Zeit ...

Antwort

2

Der Fix zu diesem ändert die Art, wie Sie das Upload-Steuerelement benennen und 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)%> 

Das funktionierte für mich !! Hoffe, es hilft jedem anderen da draußen.

4

GetHtml helper ist nicht Teil von mvc framework, Sie sollten nach Drittanbieter-Bibliothek suchen, die diesen Helper enthält.

Das Hochladen der Datei, die Teil von ViewModel ist, ist jedoch einfach. Im Grunde geht es so

Ansicht Modell definieren

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

Innen Views/Shared/EditorTemplates, schaffen MyViewModel.cshtml

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

Und entsprechende Ansicht Aktion hochladen

@model MyViewModel 

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

erforderliches Attribut ist wichtig, Daten hochladen.

Und das ist es, sobald Formular eingereicht wird, sollten Sie sehen, hochgeladene Datei innerhalb [HttpPost] Aktion, vm.MyFile.

+1

Der 'enctype =" multipart/form-data "'Teil löste es für mich. –