Asp.net Ajax 学习笔记4 UpdatePanel的使用(上)

本文介绍了ASP.NET AJAX中ScriptManager的错误处理机制,包括AllowCustomErrorsRedirect属性的作用、OnAsyncPostBackError事件的触发条件及客户端错误展示的方法。此外,还讨论了动态创建UpdatePanel和解决异步刷新控件问题的技术方案。

ScriptManager的AllowCustomErrorsRedirect属性允许用户自定义错误导向页,将此属性设置为true,配合WebConfig的customErrors可以使ScriptManager传输发生错误时自动导向用户定义的错误导向页。

ScriptManager的OnAsyncPostBackError事件,当在服务端发生异常时,此事件会触发,要触发此事件AllowCustomErrorsRedirect属性必须为false,否则此事件不会触发。在此事件处理中,可将服务端异常信息付给客户端异常信息,如以下代码

ScriptManager.GetCurrent(this).AsyncPostBackErrorMessage = e.Exception.Message;

那么在客户端如何处理呢?首先得到PageRequestManager的一个实例,并给endRequest方法加入一个事件处理器。在此事件处理器中首先判断Args参数是否能得到异常对象,通过调用get_error方法,如果得到的错误不为空,那么表示服务端发生了异常,调用set_errorHandled方法,标记此异常已经被处理过。剩下的工作就是通过客户端代码呈现这个错误的提示信息。注意Args参数中get_error()方法得到错误对象之后,这个错误对象的message是服务端的AsyncPostBackErrorMessage

UpdatePanel可以完全由服务端加载,也就是说可以直接用代码动态生成

UpdatePanel up = new UpdatePanel();
up.ID 
= "UpdatePanel1";
this.Form.Controls.Add(up);
LiteralControl lc 
= new LiteralControl(DateTime.Now.ToString());
up.ContentTemplateContainer.Controls.Add(lc);
Button btn 
= new Button();
btn.Text 
= "Refresh";
up.ContentTemplateContainer.Controls.Add(btn);
当然页面上必须有ScriptManager。注意不要为页面中的UpdatePanel添加新的Trigger。动态加载Trigger以后,在页面第一次被打开之后,PageRequestManager记住了这么一件事情:“Button1造成的提交应该作为异步刷新处理”。因此,在Button1第一次被点击时,页面进行了异步刷新。但是,在这次异步刷新之后,PageRequestManager将会忘记所有的这些信息(UpdatePanel、异步提交元素、同步提交元素、超时时间),服务器端这时也会把新的信息给传输到客户端来。说白了,就是在异步刷新PageLoad的时候,RegisterAsyncPostBackControl方法就少了一次调用,导致提交控件成为了传统的同步刷新控件。解决方案,使用反射机制调用Initialize方法
//得到UpdatePanelTrigger的Initialize方法的反射方法对象
    private static MethodInfo triggerInitMethod =
    
typeof(UpdatePanelTrigger).GetMethod(
        
"Initialize",
        BindingFlags.NonPublic 
| BindingFlags.Instance);

    
protected void Page_Load(object sender, EventArgs e)
    
{
        AsyncPostBackTrigger trigger 
= new AsyncPostBackTrigger();
        trigger.ControlID 
= "Button1";

        
this.UpdatePanel1.Triggers.Add(trigger);

        
if (ScriptManager.GetCurrent(this).IsInAsyncPostBack)
        
{
            triggerInitMethod.Invoke(trigger, 
null);
        }

    }
也就是说在PageLoad的时候,判断刷新是否是异步刷新,如果是异步刷新,重新调用Trigger的Initialize方法,将异步刷新的提交按钮重新绑定一次
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值