如何使用asp.net在页面上显示上传的文件

时间:2017-03-02 14:10:53

标签: asp.net webforms

我尝试过使用Asp.Net C#在Web服务器上上传文件的代码。代码没有编译错误,仍然在运行时它既不保存文件也不在网格视图中显示它。哪里错了?我目前的代码如下:

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();
}

1 个答案:

答案 0 :(得分:1)

您向DataTable添加行错误。但更重要的是,为什么要使用DataTable?不要使用DataTable。没有必要。这是一个毫无意义的抽象。您可以将IEnumerable个对象直接绑定到GridView。这允许您利用strongly typed个对象。

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();
}

您的GridView需要进行调整。

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

注意我要两次显示扩展名。第一种方式不那么冗长,但不是强类型。如果拼写错误&#34;扩展&#34;例如,您将在运行时收到错误,而不是编译时。第二种方式,它知道Item属于ItemType指定的类型,因此如果我们拼错Extension它可能会在编译时失败,它也可以给我们智能感知代码完成。快速失败会更好。