当前位置: 首页 > 图文教程 > 网络编程 > AJAX技术 > ASP.NET AJAX RC Tip:页面中无UpdatePanel时UpdateProgress创建出错问题

AJAX技术
AJAX 用户注册时的应用实例
ajax readyState的五种状态详解
php AJAX POST的使用实例代码
Ajax 用户名验证是否存在
Ajax+PHP简单基础入门实例教程
AJAX 异步传输数据的问题
ASP AJAX 静态分页
js装载xml文件然后发向服务器的实现代码
完成了AJAX树附原理分析
AJAX 支持搜索引擎问题分析
ajax Suggest类似google的搜索提示效果
Ajax 框架学习笔记
用ajax xml的数据读取的HelloWorld程序
Ajax 表单验证 实现代码
Ajax request response 乱码解决方法
AJAX 随记
ajax 乱码的一种解决方法
ajax session过期问题的几个解决方案
四步学会 Ajax
Ajax异步(请求)提交类 支持跨域

AJAX技术 中的 ASP.NET AJAX RC Tip:页面中无UpdatePanel时UpdateProgress创建出错问题


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 89 ::
收藏到网摘: n/a


  昨日下午,IM上遇到菌哥,被问到为什么安装ASP.NET AJAX RC之后,某些页面总是在创建UpdateProgress时出现脚本错误。当时给了一个不太好的解决方案,刚才简单看了一下System.Web.Extensions.dll中的相关实现,得出了一个更好的解决方案,在这里简单地说一下。
  首先,我模拟一个“事发现场”,由此开始解决问题:一般来说,在所有的页面中可能需要统一的Updating Animation,于是可能会将一个UpdateProgress连同ScriptManager放在MasterPage中,如下:
Site.master
<asp:ScriptManager ID="ScriptManager1" runat="server" ScriptMode="Debug">
</asp:ScriptManager>
<asp:ContentPlaceHolder id="Main" runat="server"></asp:ContentPlaceHolder>
<asp:UpdateProgress ID="UpdateProgress1" runat="server">
    <ProgressTemplate>
        Hello World!
    </ProgressTemplate>
</asp:UpdateProgress>
 
 
  如果直接以此生成一个页面,并随意加上一个UpdatePanel:
Default.aspx
<asp:Content ID="Content1" ContentPlaceHolderID="Main" Runat="Server">
    <asp:UpdatePanel runat="server">
        <ContentTemplate>
            ...
        </ContentTemplate>
    </asp:UpdatePanel>
</asp:Content>
 
 
  此时生成的HTML为:
HTML
...
<form>
...
    <script src="/AjaxEnabledWebSite/WebResource.axd?..."
 type="text/javascript"></script>
    <!-- MicrosoftAjax.js -->
    <script src="/AjaxEnabledWebSite/ScriptResource.axd?..."
 type="text/javascript"></script>
    <!-- MicrosoftAjaxWebForms.js -->
    <script src="/AjaxEnabledWebSite/ScriptResource.axd?..."
 type="text/javascript"></script>
...
    <script type="text/javascript">
        <!--
        Sys.Application.initialize();
        Sys.Application.add_init(function() {
            $create(
  Sys.UI._UpdateProgress,
  {"associatedUpdatePanelId":null,
   "displayAfter":500,
   "dynamicLayout":true},
   null,
   null,
   $get("ctl00_UpdateProgress1"));
        });
        // -->
    </script>
...
</form>
...
 
 
  请注意此时的UpdateProgress以一个Sys.UI.Control的形式使用$create被创建,而Sys.UI._UpdateProgress(看来ASP.NET AJAX不希望我们直接使用这个类)是在MicrosoftAjaxWebForms.js文件里被引入。

  于是问题就出现了,如果页面中没有UpdatePanel,那么MicrosoftAjaxWebForms.js文件不会被引入,而那句$create还在!这就导致了JavaScript错误的发生。当时我提供的方法是:那么就在Site.master里强制加上一个UpdatePanel吧。如下:
强制UpdatePanel
<asp:UpdatePanel runat="server" UpdateMode="Conditional" ID="UP1">
    <ContentTemplate></ContentTemplate>
</asp:UpdatePanel>
 
 
  这里把UpdateMode设为了Conditional,也就是说,这里的UpdatePanel永远不会被更新,它的作用只是“强迫”MicrosoftAjaxWebForms.js文件被引入。不过这不是个好的解决方案。
  如果要解决这个问题,不要让$create语句出现不就可以了吗?在查看过代码以后,发现$create语句只会在ScriptManager的Ena