2017-03-02 1 views
0

Ich habe einen Code versucht, um eine Datei auf dem Webserver mit Asp.Net C# hochladen. Der Code hat keine Kompilierungsfehler, speichert die Datei weder zur Laufzeit noch in der Grid-Ansicht. Wo ich falsch liege? Mein aktueller Code ist folgender:Wie kann ich hochgeladene Dateien auf der Seite mit asp.net zeigen

protected void Button1_Click(object sender, EventArgs e) { 
    if (FileUpload1.HasFile) 
    { 
     FileUpload1.PostedFile.SaveAs(Server.MapPath("~/resumes") + FileUpload1.FileName); 
    } 
    DataTable dt = new DataTable(); 
    dt.Columns.Add("File", typeof(string)); 
    dt.Columns.Add("Type", typeof(string)); 
    foreach (string strFile in Directory.GetFiles(Server.MapPath("~/resumes"))) { 
     FileInfo fi = new FileInfo(strFile); 
     dt.Rows.Add(fi.Name, fi.Extension); 
    } 
    GridView1.DataSource = dt; 
    GridView1.DataBind(); 
} 
+0

Haben Sie den Code debugged? Überprüft den Pfad, den es braucht? Stellen Sie sicher, dass Ihre Methode sogar getroffen wird? Warum übergeben Sie eine DataTable an das GridView? Warum binden Sie es nicht an eine stark typisierte Klasse, mit der Sie leichter arbeiten können? – mason

+0

1) Sie sagen, dass es nicht speichert: Ist 'FileUpload1.HasFile' wahr? Wird die SaveAs-Methode ausgeführt? Hast du irgendwelche Ausnahmen? Haben Sie den Ordner manuell überprüft, um festzustellen, ob die Datei vorhanden ist? – ADyson

+0

2) Anzeigen: Siehe docs: https://msdn.microsoft.com/en-us/library/system.data.datatable.rows(v=vs.110).aspx Sie können der Zeile keine Zeile hinzufügen DataTable wie Sie es tun. Die Dokumentation sagt "Um eine neue DataRow zu erstellen, müssen Sie die NewRow-Methode verwenden, um ein neues Objekt zurückzugeben. Ein solches Objekt wird automatisch nach dem Schema für die DataTable durch seine Auflistung von DataColumn-Objekten konfiguriert. Nach dem Erstellen einer neuen Zeile und Einstellung Fügen Sie die Zeile für die einzelnen Spalten in der Zeile der DataRowCollection mithilfe der Add-Methode hinzu. " – ADyson

Antwort

1

Sie fügen Ihrer DataTable Zeilen falsch hinzu. Aber was noch wichtiger ist, warum eine DataTable verwenden? Verwenden Sie keine DataTable. Es gibt keine Notwendigkeit dafür. Es ist eine sinnlose Abstraktion. Sie können eine IEnumerable von Objekten direkt an eine GridView binden. Dies ermöglicht Ihnen, strongly typed Objekte zu nutzen.

protected void Button1_Click(object sender, EventArgs e) 
{ 
    if (FileUpload1.HasFile) 
    { 
     FileUpload1.PostedFile.SaveAs(Server.MapPath("~/resumes") + FileUpload1.FileName); 
    } 

    LoadResumes(); 
} 


protected void LoadResumes() 
{ 
    var resumeFiles = new List<FileInfo>(); 

    foreach (string strFile in Directory.GetFiles(Server.MapPath("~/resumes"))) 
    { 
     var fi = new FileInfo(strFile); 
     resumeFiles.Add(fi); 
    } 

    ResumesGridView.DataSource = resumeFiles; 
    ResumesGridView.DataBind(); 
} 

Ihr GridView muss angepasst werden.

<asp:GridView id="ResumesGridView" runat="server" ItemType="System.IO.FileInfo" AutoGenerateColumns="False"> 
    <Columns> 
     <asp:BoundField DataField="Name" HeaderText="Name" /> 
     <asp:BoundField DataField="Extension" HeaderText="File Extension" /> 
     <asp:TemplateField HeaderText="File Extension Stongly Typed"> 
      <ItemTemplate> 
       <asp:Label runat="server" Text="<%#: Item.Extension %>" /> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

Hinweis Ich zeige die Erweiterung zweimal. Der erste Weg ist weniger ausführlich, aber nicht stark typisiert. Wenn Sie beispielsweise "Erweiterung" falsch schreiben, erhalten Sie zur Laufzeit einen Fehler, keine Kompilierzeit. Der zweite Weg, es weiß, dass Item von dem Typ ist, der von ItemType angegeben wird, so kann es zur Kompilierzeit fehlschlagen, wenn wir Extension falsch schreiben und es uns auch Intellisense Code-Vervollständigung geben kann. Es ist besser, schnell zu versagen.

Verwandte Themen