• FileUpLoad 兼容UpdatePanel (转)


    首先我很遗憾的告诉大家,因为微软的偷懒,目前UpdatePanel还不支持文件上传。我查了下,有两个办法,我已测试过了,真得很好用。

    方案一的解决办法就是UpdatePanel中设置PostBackTrigger:

    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>
    <asp:FileUpload ID="FileUpload1" runat="server" />
    <asp:Button ID="Button1" runat="server" Text="上传" OnClick="Button1_Click" />
    </ContentTemplate>
    <Triggers>
    <asp:PostBackTrigger ControlID="Button1" />
    </Triggers>
    </asp:UpdatePanel>
    而如果你又想在这个UpdatePanel上做点花样,比如加了一个asp:Panel, 可以通过按钮事件触发隐藏或显示的,你会发现FileUpload1并不能找到文件。。。

    其实道理很简单,UpdatePanel中的内容是通过XmlHttp实时填充的,在你让他显示之前,查看页面源代码里面是空的。一个动态控件更新普通数据没问题,但上传文件就不行了,我的解决办法是用普通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);
    }
    [转]http://hi.baidu.com/honfei/blog/item/f0902b1190b3787bcb80c46c.html

    方案二:

    转:http://www.cnblogs.com/dlwang2002/archive/2006/07/11/447722.html

    上次说到(和Atlas专家探讨Atlas的一些Bug和疑问),在Atlas里面使用FileUpload上传附件有困难:UpdatePanel每次回发的只是一个XmlHttp的请求和ViewState,并没有回发整个页面,所以,在server端无法获得FileUpload的文件。

    首先想到的解决方法就是不使用UpdatePanel:弹出一个新窗口,上传文件。新窗口里面不使用UpdatePanel。 这个方法当然可以。

    今天忽然想起来,GMail里面的附件上传:后台上传文件,还不影响你前边邮件的编辑,也不整体页面刷新。这个模式够帅!不用打开新窗口,一个页面搞定,页面也不用刷新。

    对比了一下,好象第二种方法更好一点。于是FireBug(AJAX程序的跟踪工具:fireBug0.4)了一下GMail,发现了里面的处理是这样的
    <iframe scrolling="auto" frameborder="0" onload="try{if(top.js.init)top.js._IF_OnLoaded('v1')
    <input type="file" onchange="top.js._CM_OnAttach(window,this)" name="f_ephki04a" size="50"/>
    他的上传附件是放在一个iframe 里面的,然后控件的onchange事件里面有些处理。

    果然是个不错的方法。
    于是我做了这样的处理方案:
    1:主页面中使用UpdatePanel,然后UpdatePanel里面放置的不是FileUpload控件,而是一个Iframe
    2:这个iframe在链接一个新的页面,那个页面里面有FileUpload控件。
    3:上传完毕后,告诉主页面上传得结果

    先看一个直接使用FileUpload的例子:这个例子里面,服务端是无法找到上传文件的。
                <atlas:UpdatePanel ID="up1" Mode="Conditional" runat="server">
                    <ContentTemplate>
                        <asp:FileUpload ID="FileUpload1" runat="server" />
                        <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
                     </ContentTemplate>
                </atlas:UpdatePanel>

    看看,我们该如何实现
    1:新建主页面Default.aspx
          在适当的位置,放置一个上传附件的UpdatePanel区域
         
                <atlas:UpdatePanel ID="up_attachment" Mode="Conditional" runat="server">
                    <ContentTemplate>
                       <iframe id="file" name="file" src="attachment.aspx"></iframe>
                    </ContentTemplate>
                </atlas:UpdatePanel>
    2:新建上传文件的页面attachment.aspx,然后放上FileUpload控件
    <div>
        <asp:FileUpload ID="FileUpload1" runat="server" />
              <asp:Button ID="Button1" runat="server" Text="OK" OnClick="Button1_Click" />
        </div>
    3:在attachment.aspx里面,上传文件之后调用主页面的js,报告上传情况。这是函数原型:
        <script>
          window.top.callBack(fileName);
        </script>
    4:Default.aspx主页面里面增加这个函数,处理返回值

        <script>
         function callBack(fileName)
         {
            document.getElementById('Attach1').innerHTML=fileName;
         }
        </script>


    然后,搞定。
    这个方案,虽然还是两个页面,但是看起来处理都在一个页面里面,页面处理无刷新。

  • 相关阅读:
    AGC 014 B
    AGC 012 D
    AGC 012 C
    python
    Linux
    Linux
    Linux
    Linux 之 光标消失隐藏术
    Linux
    python
  • 原文地址:https://www.cnblogs.com/zhwl/p/2335018.html
Copyright © 2020-2023  润新知