You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET中如何在protected方法间传递上传图片的文件名?

解决ASP.NET中跨Protected方法传递上传文件名的问题

我来帮你搞定这个问题~你现在遇到的核心问题是:ASP.NET的FileUpload控件在页面回传后,它的FileName值会丢失,所以直接在submit方法里取FileUpload1.FileName是拿不到之前上传的文件名的。下面给你几个实用的方案,按需选择:

方案1:使用ViewState(推荐同一页面内传递)

ViewState是ASP.NET用来保存页面状态的机制,适合在同一个页面的不同回传方法间传递数据,不会占用服务器会话资源。

修改你的代码如下:

protected void Upload1(object sender, EventArgs e)
{
    //Extract Image File Name.
    string fileName = Path.GetFileName(FileUpload1.PostedFile.FileName);
    //Set the Image File Path.
    string filePath = "~/Uploads/" + lblTdcNo.InnerText + "1" + lblRevision.InnerText;
    //Save the Image File in Folder.
    FileUpload1.PostedFile.SaveAs(Server.MapPath(filePath));
    gvImages.ImageUrl = "~/Uploads/" + Path.GetFileName(FileUpload1.FileName);
    
    // 把文件名存入ViewState
    ViewState["UploadedFileName"] = fileName;
}

protected void submit(object sender, EventArgs e)
{
    // 从ViewState取出文件名,记得做空值判断
    string img1 = ViewState["UploadedFileName"] as string;
    if (!string.IsNullOrEmpty(img1))
    {
        // 这里写你保存img1的逻辑
    }
}

方案2:使用Session(适合跨页面或长时间保留状态)

如果你的submit操作可能涉及跳转到其他页面,或者需要在多个请求间保留文件名,可以用Session。但注意用完要清理Session,避免占用服务器资源。

修改代码:

protected void Upload1(object sender, EventArgs e)
{
    string fileName = Path.GetFileName(FileUpload1.PostedFile.FileName);
    string filePath = "~/Uploads/" + lblTdcNo.InnerText + "1" + lblRevision.InnerText;
    FileUpload1.PostedFile.SaveAs(Server.MapPath(filePath));
    gvImages.ImageUrl = "~/Uploads/" + Path.GetFileName(FileUpload1.FileName);
    
    // 存入Session
    Session["UploadedFileName"] = fileName;
}

protected void submit(object sender, EventArgs e)
{
    string img1 = Session["UploadedFileName"] as string;
    if (!string.IsNullOrEmpty(img1))
    {
        // 保存逻辑
        // 用完清理Session
        Session.Remove("UploadedFileName");
    }
}

方案3:使用隐藏字段(适合需要和页面HTML交互的场景)

你可以在页面上添加一个服务器端的隐藏字段,把文件名存在里面,回传后就能读取到。

首先在ASPX页面添加控件:

<asp:HiddenField ID="hfUploadedFileName" runat="server" />

然后修改后台代码:

protected void Upload1(object sender, EventArgs e)
{
    string fileName = Path.GetFileName(FileUpload1.PostedFile.FileName);
    string filePath = "~/Uploads/" + lblTdcNo.InnerText + "1" + lblRevision.InnerText;
    FileUpload1.PostedFile.SaveAs(Server.MapPath(filePath));
    gvImages.ImageUrl = "~/Uploads/" + Path.GetFileName(FileUpload1.FileName);
    
    // 把文件名存入隐藏字段
    hfUploadedFileName.Value = fileName;
}

protected void submit(object sender, EventArgs e)
{
    string img1 = hfUploadedFileName.Value;
    if (!string.IsNullOrEmpty(img1))
    {
        // 保存逻辑
    }
}

这三个方案都能解决你的问题,优先推荐ViewState,因为它是页面级的状态管理,资源开销最小。如果有跨页面需求再考虑Session,隐藏字段则适合需要和前端JS交互的场景~

内容的提问来源于stack exchange,提问作者Mohan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:58:26