UpdatePanel Control

UpdatePanel Control原帖地址:http://www.cnblogs.com/caviare/archive/2007/09/21/901500.html另外关于UpdateProgress和Timer控件的使用,可以参考http://read.newbooks.com.cn/info/168590.html UpdatePanel  对于UpdatePanel控件的使用是ASP.N

大家好,又见面了,我是你们的朋友全栈君。

原帖地址:http://www.cnblogs.com/caviare/archive/2007/09/21/901500.html

另外关于UpdateProgress和Timer控件的使用,可以参考http://read.newbooks.com.cn/info/168590.html

 

UpdatePanel

  对于UpdatePanel 控件的使用是ASP.NET AJAX Extentions的重要部分。我们收到了关于它和UpdateProgress 控件的大量用户反馈。为了增强局部刷新的功能我们作了多处修改,并加强了UpdatePanel 对于控件的兼容性。我们也为异步PoskBack实现了一个丰富的事件模型,这样您就可以在客户端响应它们并对页面更新提供额外操作了。

ScriptManager Control

  在RTM版本中,ScriptManager 有一个EnablePartialRendering 属性,其默认值为true ,这减少了使用UpdatePanel 来做异步的页面局部刷新所需的步骤。

  为了降低控件的复杂程度,ScriptManagerErrorTemplate 属性在RTM版本中被去除了。现在错误处理的模型变得更加灵活,例如您可以为它创建一个独立的服务器控件。另外,您现在也可以使用ScriptManagerAsyncPostBackErrorMessage 属性,不过它只是设置了默认的错误信息,如果您需要动态地自定义的错误信息的话,您可以使用AsyncPostBackError 事件。

  现在ScriptManager 暴露出了一个新的属性AsyncPostBackTimeout ,以此控制异步PostBack的超时时间。

  值得一提的是,服务器控件目前可能会使用到ScriptManager 中新增的注册方法。这个方法增加了对于UpdatePanel 使用的支持,并减少了CTP版本中UpdatePanel 的复杂性。现在的资源已经包括了脚本,样式表,Hidden Field等。ClientScriptManager 中的方法与上述方法相对应。它们能够接受一个控件实例作为参数,这样如果在UpdatePanel 中使用这些控件,他们所需的脚本就能被正确跟踪了。

Dynamic UpdatePanel Controls

  现在有两种在页面中动态添加UpdatePanel 的方法,这是RTM版本中最大的改进。使用动态UpdatePanel 的方法是:

  • 编写自定义控件的开发人员现在能够将UpdatePanel 控件添加到组合控件中。这样,只要页面中存在ScriptManager 并且其EnablePartialRendering 设为true ,这样就能使用该自定义控件并得到局部刷新的体验了。并且,如果页面中没有ScriptManager ,也能在传统PostBack模型中正常使用该控件。
  • 页面开发人员能够在其他控件的模版中添加UpdatePanel

下面的示例展示了如何在自定义控件中使用
UpdatePanel 控件。

protected
 
override
 
void
 CreateChildControls() {

    

base
.CreateChildControls();

    ScriptManager sm 
=
 ScriptManager.GetCurrent(Page);
    Control parent;
    Control container;
    

if
 (sm 
==
 
null
 
||
 
!
sm.EnablePartialRendering) {

        

//
 If not doing partial rendering, use a
        

//
 dummy control as the container.


        parent 
=
 container 
=
 
new
 Control();
    }
    

else
 {

        

//
 Create an UpdatePanel control.


        UpdatePanel up 
=
 
new
 UpdatePanel();

        
//
 Instead of adding child controls directly to 
        

//
 the UpdatePanel control, add them to its 
        

//
 ContentTemplateContainer.


        container 
=
 up.ContentTemplateContainer;
        parent 

=
 up;
    }

    AddDataControls(container);
    Controls.Add(parent);
}

Client Events During Asynchronous Postbacks

  在CTP版本中,客户端
PageRequestManager 对象依靠
XMLHttpRequest 对象来实现异步的PoskBack并处理
Response 。在RTM版本中,
PageRequestManager 对象提供了一个异步PoskBack的生命周期事件,您能够使用它们自定义处理Request和Response的方式。以下为可用的客户端事件,并且提供了事件所需的参数信息:

  • initializeRequest :您能够使用这个事件来取消即将发送的异步PostBack请求,它也能够让您根据PostBack信息来做一些额外的工作。这个事件的参数为InitializeRequestEventArgs 类型。
  • beginRequest :您能够使用该事件来启动某些工作,例如您可以在这个事件中显示Progress并且在endRequest 事件中再将其隐藏。这个事件的参数为BeginRequestEventArgs
  • pageLoding :您能够使用这个事件中为UpdatePanel 的即将更新或删除进行一些额外的工作,例如释放资源。您也可以在响应这个事件时检查服务器端发送过来的自定义信息,以此进行一些自定义工作。这个事件的参数为PageLoadingEventArgs 类型。
  • pageLoaded :这个事件和pageLoading 事件相似,它提供了异步PostBack结果所创建的UpdatePanel 的信息。这个事件的参数为PageLoadedEventArgs 类型。
  • engRequest :您能够使用这个事件来自定义错误处理方式,处理服务器端发送的额外信息等工作。您可以使用它来隐藏UpdateProgress 控件。这个事件的参数为EndRequestEventArgs 类型。


Developing Controls Compatible with the UpdatePanel Control

  在CTP版本中,
UpdatePanel 控件会处理许多被输出的对象,甚至包括不在
UpdatePanel 中的控件,然后在页面上进行完整的更新。这使一些控件无法和
UpdatePanel 兼容了。例如,在CTP版本中,如果在
UpdatePanel 动态添加ASP.NET验证控件的话,它们便无法正确工作了,这种情形在使用
Wizard 控件的每一步中验证用户输入时尤为常见。

  在RTM版本中改变了
UpdatePanel 的模型。您可以使用注册脚本类库相同的办法,向
ScriptManager 注册将要发送到客户端的脚本或数据。在RTM版本中包括了一组新的ASP.NET验证控件,它们会将自己的脚本使用
ScriptManager 注册。这些新控件的Tag名与ASP.NET原有的验证控件相对应,因此您不需要改变在页面中声明创建的验证控件。不过,如果在
UpdatePanel 内部使用了验证控件的话,您需要改变代码以使用新的控件。

  下面的示例展示了RTM版本中的一个兼容
UpdatePanel 的自定义控件。如下:

protected
 
override
 
void
 OnPreRender(EventArgs e) {

    

base
.OnPreRender(e);

    Control control 
=
 FindControl(_controlID);

    
//
 Register scripts with new ScriptManager APIs.
    

//
 The scripts hook up new PageRequestManager events.


    
string
 script 
=
 String.Format(
        CultureInfo.InvariantCulture,

@”
var {0}_hover = 
new Microsoft.Samples.HoverExtender(document.getElementById(‘{1}’), ‘{2}’);
{0}_hover.attach();


,
        ClientID,
        control.ClientID,
        ColorTranslator.ToHtml(BackgroundColor));

    ScriptManager.RegisterClientScriptInclude(
        
this

typeof
(HoverExtender), 

HoverExtenderScript

,
        ResolveClientUrl(


~/ScriptLibrary/HoverExtender.js

));
    ScriptManager.RegisterStartupScript(
        

this

typeof
(HoverExtender), ClientID, script, 
true
);
}

Sending Additional Data to the Client

  在CTP版本中,有个功能比较难以实现,那就是在异步PoskBack页面后,根据从服务器端收到的数据更新UpdatePanel外的控件。在RTM版本中可以通过调用ScriptManager的一个方法将数据注册并输出到页面,以此解决这个问题。

  试想,如果需要使用服务器的代码来改变客户端的Timer控件的interval和enabled属性的值,但是这个Timer却不在UpdatePanel中。在CTP版本中是无法做到这一点的。

  在RTM版本中,
ScriptManager 在服务器段保存了一个字典对象,您可以使用
RegisterDataItem 方法来更新和注册对象。这个字典会被发送到客户端,您可以在客户端的
pageLoading
pageLoaded
endRequest 事件中通过
eventArgs.get_dataItems() 方法获得该字典对象。

  下面的示例展示了注册数据的方法:

//
 Server control code.




public
 
int
 interval {

    

get
 {…}
    

set
 {

        _data 

=
 value;
        …
    }
}


void
 PreRender() {

    ScriptManager sm1 

=
 ScriptManager.GetCurrent(Page);
    

if
 (sm1 
!=
 
null
 
&&
 sm1.IsInAsyncPostBack) {

        ScriptManager.RegisterDataItem(

this
, _data.ToString());
    }

    
//
 The control also needs to register script to handle the
    

//
 endRequest event on the client and retrieve this value. 
    

//
 The script below adds a handler for the current instance 
    

//
 of the PageRequestManager object and calls the 
    

//
 get_dataItem() method from eventArgs.


    ScriptManager.RegisterClientScriptBlock(
this

this
.GetType(), key, script)
}

Comment

  上面的代码最有意思的可能是最后一行,它的作用是在客户端的PageRequestManager对象中注册一个endRequest的handler,以此来做一些修改或者别的工作。其实有了这个方法之后,即使没有向客户端输出DataItem的支持,也已经能够在操作客户端对象了。有了DataItem这一功能之后,可能更重要的作用就是能够使服务器端代码和客户端代码分开,分别进行集中地维护。

Custom Error Handling and Redirection

  在CTP版本中并没有提供控制错误的办法,甚至没有自定义错误的设置。在RTM版本中则解决了这个问题。

  在
ScriptManager 对象里提供了一个属性:
AllowCustomError 。当该属性被设为
false 时,
ScriptManager 对象会覆盖自定义的错误跳转,并将错误信息发送到客户端,这样您就可以将错误信息显示出来,而避免了页面被转向到其他地方。

  在RTM版本中是通过一个额外的
Redirct
  Module来控制页面转向的。因此,在RTM版本中已经能够处理跨页面的Posting的情况。


Triggers

  在CTP版本中,
ScriptManager 控件使用了
ControlValueTrigger
ControlEventTrigger 类型,并将它们存放一个触发器集合中,以此将这些触发器绑定到页面的控件上去。在RTM版本中,两者被集中到了一个类型:
AsyncPostBackTrigger ,以此避免以前的两个触发器可能带来的混乱状况。

  根据用户反馈,我们增加了一个
PostBackTrigger 对象,它提供了了从
UpdatePanel 内部产生页面完全(同步)PostBack的能力。这个
Trigger 对象现在也能够与实现了
IPostbackEventHandler
IPostbackDataHandler 或者
INamingContainer 接口的控件配合使用。

  
AsyncPostBackTrigger 能够使
UpdatePanel 触发异步的PostBack更新。这个触发器也能指向
UpdatePanel 外部的控件,或者指向控件的层次结构中的父控件。当一个作为naming container的控件被指定为触发器,则它内部的所有控件所引发的PoskBack都和这个触发器的行为相同。

  下面的例子展示了
AsyncPostBackTrigger 对象声明形式的使用方法:

<
asp:Button 
runat
=”server”
 id
=”Button1″
 Text
=”Go”
 
/>


<
asp:UpdatePanel 
ID
=”UP1″
 UpdateMode
=”Conditional”
 runat
=”server”
>

    

<
ContentTemplate
>
</
ContentTemplate
>

    

<
Triggers
>

        

<
asp:AsyncPostBackTrigger 
ControlID
=”Button1″
 
/>

    

</
Triggers
>


</
asp:UpdatePanel
>

  一个
PostBackTrigger 能够指向一个
UpdatePanel 内部的控件,使它能产生普通的PostBack。这些控件必须是当前UpdatePanel内部的控件。


UpdateProgress Control

  在RTM版本中增强了
UpdateProgress 控件,使它具有了一个额外的功能:指定一个时间间隔,只有异步PostBack超出这个时间后才显示Progress控件。您也可以控制UpdateProgress的输出来控制这个控件在隐藏时是否会占用页面的空间,就像设置ASP.NET验证控件的
DisplayMode 属性一样。另外,您还可以通过增加几行代码,为Progress UI添加一个取消的功能。

  下面的例子展示了如何设置
UpdateProgress 控件,使它只在PostBack超过半秒(500毫秒)之后才显示出来:

<asp:UpdateProgress runat=server ID=”Progress1″ DisplayAfter=”500″>

    <ProgressTemplate>

        <b>Working on request…</b>

        <input type=”button” id=”abortButton” οnclick=”abortPB()” value=”Cancel” />

    </ProgressTemplate>

</asp:UpdateProgress>

<script type=”text/javascript”>


    function abortPB() {

        var obj = Sys.WebForms.PageRequestManager.getInstance();
        if (obj.get_isInAsyncPostBack()) {

            obj.abortPostBack();
        }
    }


</script>

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/163526.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Python代码画爱心_python代码画人物

    Python代码画爱心_python代码画人物用python一行代码画出爱心print(‘\n’.join([”.join([(‘LoveSongxiaolong'[(x-y)%8]if((x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3&lt;=0else”)forxinrange(-30,30)])foryinrange(15,-15,-1)]))结果为:…

    2025年9月6日
    7
  • notepad++ 怎么把空格替换成回车?

    notepad++ 怎么把空格替换成回车?notepad++ 怎么把空格替换成回车?

    2022年4月23日
    197
  • 共享打印机错误代码709_连接共享打印机错误0*0000011b

    共享打印机错误代码709_连接共享打印机错误0*0000011b最近发现很多用户连接或安装局域网共享的打印机时出现很多问题,常见的错误代码是0x0000011b和0x00000709或0x000006d9这三个错误。要如何解决呢?下面来讲一下如何解决这两个问题。键盘组合键徽标键Win+R键打开运行,在弹出的运行框中输入【services.msc】确定打开服务窗口,检查这两个服务是否已启动:PrintSpooler和WindowsFirewall一般Win7易出的错误6d9是后面的服务未启动所致。依次查找并卸载KB5005565、KB5005566、KB5005…

    2022年9月10日
    3
  • PyYAML中文文档「建议收藏」

    PyYAML中文文档「建议收藏」PyYAML文档PyYAML现在维护在https://github.com/yaml/pyyaml。此页面仅用于历史目的。英文文档链接:http://pyyaml.org/wiki/PyYAMLDocumentation安装下载源码包PyYAML-3.12.tar.gz并解压缩。转到目录PyYAML-3.12并运行$pythonsetup….

    2022年8月30日
    2
  • python re.compile() 详解——Python正则表达式「建议收藏」

    python re.compile() 详解——Python正则表达式「建议收藏」1概述当我们在Python中使用正则表达式时,re模块内部会干两件事情:编译正则表达式,如果正则表达式的字符串本身不合法,会报错;用编译后的正则表达式去匹配字符串。那么如果一个正则表达式要重复使用几千次,出于效率的考虑,我们是不是应该先把这个正则先预编译好,接下来重复使用时就不再需要编译这个步骤了,直接匹配,提高我们的效率2compile()预编译十分的简单,re.co…

    2022年9月1日
    2
  • MySQL的时间差函数TIMESTAMPDIFF、DATEDIFF的用法「建议收藏」

    MySQL的时间差函数TIMESTAMPDIFF、DATEDIFF的用法「建议收藏」MySQL的时间差函数TIMESTAMPDIFF、DATEDIFF的用法时间差函数TIMESTAMPDIFF、DATEDIFF的用法我们在写sql语句,尤其是存储过程中,会频繁用到对于日期、时间的比较和判断,那么对于这两个时间差比较函数用法做一个举例介绍。datediff函数,返回值是相差的天数,不能定位到小时、分钟和秒。–相差2天selectdatediff(‘2018-03-2209:…

    2022年6月13日
    47

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号