美文网首页Asp.net开发
ASP.NET-细节-UpdatePanel与UpLoad不兼容

ASP.NET-细节-UpdatePanel与UpLoad不兼容

作者: 柠檬正在努力 | 来源:发表于2020-03-27 22:30 被阅读0次
起因:

今天忽然有个客户报Bug,无法上传文件,报错引发类型为System.Web.HttpUnhandledException的异常 ,PostedFile.FileName经过反复调试,发现服务器控件回传到服务器却没有任何数据。

处理过程:
  • 首先进行后台调试,打断点发现PostedFile.FileName Is Nothing,马上查代码确认是否设置input为服务器控件、是否名字调用正确
  • 确认为服务器控件,名字正确,考虑PostBack过程出现问题
  • 定位问题为UpdatePanelUpLoadFile不兼容
原因:

目前UpdatePanel还不支持文件上传,UpdatePanel中的内容是通过XmlHttp实时填充的,在你让他显示之前,查看页面源代码里面是空的。一个动态控件更新普通数据没问题,但上传文件就不行了,回传服务器的PostedFile.FileName始终会是空的。


解决办法:

一、UpdatePanel中设置PostBackTrigger

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>
        <asp:FileUpload ID="FileUpload1" runat="server" />
        <asp:Button ID="cmdUpLoad" runat="server" Text="上传"/>
    </ContentTemplate>
    <Triggers>
        <asp:PostBackTrigger ControlID="cmdUpLoad" />
    </Triggers>
</asp:UpdatePanel>

二、是用普通div代替asp:Panel,并写了2个函数来动态发送控制脚本,按钮事件中只要调用该函数即可

<div id="Panel1"></div>

private void ShowPanel()
{
    string script = "document.getElementById('Panel1').style.display='';";
    ScriptManager.RegisterStartupScript(this.Page, this.GetType(), "ShowPanel", script, true);
}
private void ClosePanel()
{
    string script = "document.getElementById('Panel1').style.display='none';";
    ScriptManager.RegisterStartupScript(this.Page, this.GetType(), "ClosePanel", script, true);
}

三、上传附件是放在一个iframe里面

//要上传文件的UpdatePanel
<Asp:UpdatePanel ID="upLoad" runat="server">
    <ContentTemplate>
        <iframe id="file" name="file" src="attachment.aspx"></iframe>
    </ContentTemplate>
</Asp:UpdatePanel>

//上传文件的页面,里面放FileUpload控件
<div>
    <asp:FileUpload ID="FileUpload" runat="server" />
    <asp:Button ID="btnUpLoad" runat="server" Text="文件上传" />
</div>

//上传文件之后调用主页面的js,回传上传文件情况
<script>
    window.top.callBack(fileName);
</script>

//主页面处理返回值
<script>
function callBack(fileName)
{
    document.getElementById('txtFileName').innerHTML=fileName;
}
</script>

特别提示:

FileUpload是在.net中用到比较多的上传文件的控件,而上传文件的过程中涉及到最多的就是文件名和文件路径。
PostedFile.FileName:是获取文件的路径,即FileUpload控件文本框中的所有内容
FileName:获取上传的文件名。
如: 浏览器点击“浏览…”选择了文件后,文本框中显示的是D:\Files\Test\Demo.txt, 我们想要的也是这个。

IE :

  • FileUpload1.PostedFile.FileName得到的是:D:\Files\Test\Demo.txt
  • FileUpload1.FileName得到的是:Demo.txt

Chrome:

  • FileUpload1.PostedFile.FileName得到的是:Demo.txt
  • FileUpload1.FileName得到的是:Demo.txt

相关文章

网友评论

    本文标题:ASP.NET-细节-UpdatePanel与UpLoad不兼容

    本文链接:https://www.haomeiwen.com/subject/sgaruhtx.html