AsyncFileUpload在用户控件UpdatePanel中引发回传致变量丢失求助
解决AsyncFileUpload在UpdatePanel中丢失公共变量的问题
我完全懂你的困扰——明明没触发常规回传,但公共变量connum却在上传时被清空了。这其实是因为AsyncFileUpload的上传请求本质上是一个独立的、不携带页面ViewState的异步HTTP请求,和你初始化connum的页面请求完全是两个上下文,所以你之前赋值的公共变量自然就丢失了。
下面给你几个可行的解决方案:
方案1:用Session存储connum
Session是跨请求保存数据的常用方式,适合这种场景:
- 初始化
connum时,同时把它存入Session:
usercontrol1.connum = "200001" Session("connum") = usercontrol1.connum
- 在
FileUploadComplete事件中,从Session里读取值:
Public Sub FileUploadComplete(ByVal sender As Object, ByVal e As EventArgs) Dim connum As String = Session("connum").ToString() Dim FilePath As String = "\\ukwilv-as3\Aspray\" + connum + "\" Dim filename As String = System.IO.Path.GetFileName(AFU1.FileName) ' 确保目录存在,避免报错 If Not System.IO.Directory.Exists(FilePath) Then System.IO.Directory.CreateDirectory(FilePath) End If AFU1.SaveAs(System.IO.Path.Combine(FilePath, filename)) End Sub
方案2:将connum存入AsyncFileUpload的自定义属性
AsyncFileUpload自带ExtraData属性,专门用来传递额外数据到上传事件:
- 在用户控件加载赋值时,设置控件的ExtraData:
usercontrol1.connum = "200001" usercontrol1.AFU1.ExtraData = usercontrol1.connum
- 在上传事件中读取这个属性(注意要更换事件参数类型):
Public Sub FileUploadComplete(ByVal sender As Object, ByVal e As AjaxControlToolkit.AsyncFileUploadEventArgs) Dim connum As String = e.ExtraData Dim FilePath As String = "\\ukwilv-as3\Aspray\" + connum + "\" Dim filename As String = System.IO.Path.GetFileName(AFU1.FileName) If Not System.IO.Directory.Exists(FilePath) Then System.IO.Directory.CreateDirectory(FilePath) End If AFU1.SaveAs(System.IO.Path.Combine(FilePath, filename)) End Sub
方案3:用HiddenField保存并启用ViewState
如果不想依赖Session,可以在UpdatePanel里加一个HiddenField,把connum存在里面并启用ViewState:
- 修改用户控件的UpdatePanel代码:
<asp:UpdatePanel ID="up1" runat="server" UpdateMode="Conditional"> <ContentTemplate> <asp:HiddenField ID="hdnConnum" runat="server" EnableViewState="true" /> <ajaxToolkit:AsyncFileUpload ID="AFU1" runat="server" OnUploadedComplete="FileUploadComplete" /> </ContentTemplate> </asp:UpdatePanel>
- 初始化
connum时,同时给HiddenField赋值:
usercontrol1.connum = "200001" usercontrol1.hdnConnum.Value = usercontrol1.connum
- 在上传事件中读取HiddenField的值:
Public Sub FileUploadComplete(ByVal sender As Object, ByVal e As EventArgs) Dim connum As String = hdnConnum.Value Dim FilePath As String = "\\ukwilv-as3\Aspray\" + connum + "\" Dim filename As String = System.IO.Path.GetFileName(AFU1.FileName) If Not System.IO.Directory.Exists(FilePath) Then System.IO.Directory.CreateDirectory(FilePath) End If AFU1.SaveAs(System.IO.Path.Combine(FilePath, filename)) End Sub
额外提示
- 尽量用
System.IO.Path.Combine()来拼接路径,避免因为斜杠问题导致的错误。 - 一定要检查目标目录是否存在,否则保存文件时会抛出异常。
内容的提问来源于stack exchange,提问作者Bradley Summers
相关产品推荐
相关产品推荐

