美文网首页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