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

ajax|asp.net|创建|问题|页面

  昨日下午,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的EnablePartialRendering属性为True的情况下出现,那么我们就把ScriptManager的这个属性暴露出去吧。我们可以修改一下Site.master.cs中Site类的代码,把它增加一个属性:

Site.master.cs
public bool EnablePartialRendering
{
    get
    {
        return this.ScriptManager1.EnablePartialRendering;
    }
    set
    {
        this.ScriptManager1.EnablePartialRendering = value;
    }
}
 
 

  然后在页面里把MasterPage的EnablePartialRendering属性设为False即可。需要注意的是只有Init阶段才能设置ScriptManager的EnablePartialRendering属性。如下:

Default.aspx.cs
protected override void OnInit(EventArgs e)
{
    base.OnInit(e);

    (this.Master as Site).EnablePartialRendering = false;
}
 
 

  至此,任务结束。

http://www.cnblogs.com/JeffreyZhao/archive/2006/12/20/597416.html

时间: 2024-12-30 17:09:22

ASP.NET AJAX RC Tip:页面中无UpdatePanel时UpdateProgress创建出错问题的相关文章

“ASP.NET 2.0 正式版中无刷新页面的开发”中示例代码与Firefox兼容的解决

asp.net|解决|示例|刷新|无刷新|页面 这几天正着手开始写毕业设计,因为发生了一些事情,所以一直拖到现在才开始.其实我准备做一个ASP.NET 2.0并且使用AJAX的Web项目,于是到博客园到处寻着AJAX的文章,恰好翻到了Leon.Zhou的ASP.NET 2.0 正式版中无刷新页面的开发按照代码示例和讲解做了一个页面,确实不错啊.因为俺平时几乎都用Firefox,所以就顺手测试了一下Firefox下的效果,结果发现点了Button之后没有反应--于是打开Javascript控制台,

【转】了解使用 ASP.NET AJAX 进行局部页面更新

简介 Microsoft的 ASP.NET 技术提供了一个面向对象.事件驱动的编程模型,并将其与已编译代码的优势结合起来.但其服务器端的处理模型仍存在技术本身所固有的几点不足: 进行页面更新需要往返服务器,因此需要页面刷新: 来回往返不会保留 Javascript 或其他客户端技术(如 Adobe Flash)生成的任何效果. 在回传过程中,除 Microsoft Internet Explorer 之外的浏览器都不支持自动存储滚动位置.而即使在Internet Explorer 中,页面刷新时

ASP.NET 2.0 正式版中无刷新页面的开发(示例代码的补充)

asp.net|示例|刷新|无刷新|页面 原文请见Leon.Zhou的:http://pfzhou.cnblogs.com/archive/2006/03/31/363342.html 下载了示例代码,并转换成VB了,AJAX功能测试成功.但遇到些小问题:Demo1很正常.Demo2按Leon原来的写法testAJAX.aspx.vb中Line 22不成功.所以我直接在IDE环境中,修改button3的OnClientClick属性,见testAJAX.asp的Line 52.测试成功.Demo

AJAX实现web页面中级联菜单的设计

ajax|web|菜单|设计|页面 看了大峡搞的级联菜单,我也班门弄斧一把,嘿嘿,花了一点时间搞了个级联菜单贴上来看看.本例中只要你选择成员分类名称就会自动显示成员名称:    首先在eclipse中建一个项目,名称你自己做主了,这里为Easyjf-menu,对应的浏览器页面代码为: Easyjf-menu.jsp <@page contentType="text/html;charser=UTF-8" language="java"%> <hea

asp.net 使用驻留在页面中的Cache缓存常用可定时更新的数据_实用技巧

就是希望让Web应用程序从一开始运行到结束都一直存在,有人就说为什么不用Application呢?其实Cache是可以一段时间内自动更新数据的,而Application就无法做成这样的,另外Application在Web这种高并发的系统中一定要考虑线程安全的问题,Application本身就不是线程安全的,而Cache就是线程安全.所以一般我都会在很多对象中我只从Web开始运行的时候从数据库或文件里获取一次数据,在不同的页面中,都是使用Cache的,而且Cache中的数据可能弄成自动更新的,所以

AJAX实现web页面中级联菜单的设计_AJAX相关

看了大峡搞的级联菜单,我也班门弄斧一把,嘿嘿,花了一点时间搞了个级联菜单贴上来看看.本例中只要你选择成员分类名称就会自动显示成员名称:     首先在eclipse中建一个项目,名称你自己做主了,这里为Easyjf-menu,对应的浏览器页面代码为:  Easyjf-menu.jsp  <@page contentType="text/html;charser=UTF-8" language="java"%>  <head>    --..

asp.net使用驻留在页面中的Cache缓存常用可定时更新的数据

这个就先需要先知道一下System.Web.Caching.Cache类,其实在我做WEB应用的时候,我会将一些使用 频繁但是又要经常使用并且需要急时更新的对象放到Cache中,这样可以很大程序上减少从硬盘上读取数 据的次数. 就是希望让Web应用程序从一开始运行到结束都一直存在,有人就说为什么不用Application呢?其实 Cache是可以一段时间内自动更新数据的,而 Application就无法做成这样的,另外Application在Web这 种高并发的系统中一定要考虑线程安全的问题,A

asp.net ajax学习系列功能强大的UpdatePanel控件

ajax|asp.net|控件 先给一个简单的例子,后面给一个比较复杂的例子. 改进后的UpdatePanel使页面部分更新(Partial-Page Updates)实现起来非常容易.要想在已有web页面或新建页面中加入部分更新内容,都十分容易,下面几个步骤:<1>在页面中加入ScriptManager控件.并保证ScriptManager控件的EnablePartialRendering属性值为true.若EnablePartialRendering=false,那么下面所做的对页面部分更

ASP.NET AJAX Advance Tips &amp;amp; Tricks (5) UpdatePanel与jQuery

前言 现在越来越多的朋友喜欢将jQuery和ASP.NET AJAX 一起来用,最近,许多印度人在forum里抱怨说 UpdatePanel和jQuery不兼容,许多jQuery效果在UpdatePanel更新之后就不work.本篇通过分析两者的框 架结构来解决这个兼容性问题. 问题重现: 1.在页面中添加ScriptManager和UpdatePanel 2.在UpdatePanel中添加元素A 3.用jQuery对元素A添加X效果 4.在UpdatePanel中加一个ButtonB用作pos