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

AJAX技术
自己动手封装的 ajax
Ajax 对象 包含post和get两种异步传输方式
Ajax 超时检查脚本
AJAX 简介及入门实例
ajax 开发守则 10条说明
Ajax 返回字符串的过滤实现代码
Ajax 程序开发中常见问题
AJAX 验证框架13个
ajax 入门基础之 XMLHttpRequest对象总结
基于AJAX的分页类实现代码
如何在Asp.net中使用HtmlArea编辑器
使用 jQuery 简化 Ajax 开发
ASP.NET 与 Ajax 的实现方式
AJAX技术介绍
Ajax程序设计入门
学习Ajax教程,详细了解Get与Post
关于Ajax responseText 的一点阐述
ajax中文乱码解决方法
AJAX中文问题总结
AJAX无刷新更新数据

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 83 ::
收藏到网摘: 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