`
chenqi210
  • 浏览: 78932 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

IPostBackDataHandler & IPostBackEventHandler

阅读更多
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;

namespace WebControls.Test
{
    public class PBLink:WebControl,IPostBackEventHandler
    {
        [Category("Behavior")]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public string Text
        {
            get
            {
                object o = ViewState["Text"];
                return o == null ? String.Empty : (string)o;
            }

            set { ViewState["Text"] = value; }
        }

        protected override void OnPreRender(EventArgs e)
        {
            if (Page != null)
                Page.RegisterRequiresPostBack(this);
            base.OnPreRender(e);
        }

        protected override void Render(HtmlTextWriter writer)
        {
            if (Page != null)
                Page.VerifyRenderingInServerForm(this);
            base.Render(writer);
        }

        protected override void RenderContents(HtmlTextWriter writer)
        {
            writer.Write(Text);
        }

        #region IPostBackEventHandler members

        public void RaisePostBackEvent(string eventArgument)
        {
            throw new NotImplementedException();
        }

        #endregion

        protected override HtmlTextWriterTag TagKey
        {
            get
            {
                return HtmlTextWriterTag.A;
            }
        }
    }
}

 运行后会报错:

 

“/WebSite”应用程序中的服务器错误。

只能对实现 IPostBackDataHandler 的控件调用 Page.RegisterRequiresPostBack。

说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.Web.HttpException: 只能对实现 IPostBackDataHandler 的控件调用 Page.RegisterRequiresPostBack。

源错误:

 

行 27:         {
行 28:             if (Page != null)
行 29:                 Page.RegisterRequiresPostBack(this);
行 30:             base.OnPreRender(e);
行 31:         }

 


源文件: C:\MyProjects\csharp\test\controls\Controls\WebControls\Test\PBLink.cs    行: 29

 

 

 

 

至少说明

Page.RegisterRequiresPostBack 是和 IPostBackDataHandler 一起用的。

Page.RegisterRequiresRaiseEvent 一次只接受一个控件。

 

例如:

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.UI.WebControls;
using System.Web.UI;
using System.Collections.Specialized;
using System.ComponentModel;

namespace WebControls.BookSample
{
    public class SimpleTextBoxTextChangedEventArgs : EventArgs
    {
        private string m_OldText;
        private string m_NewText;

        public SimpleTextBoxTextChangedEventArgs(string oldTxt, string newTxt)
        {
            m_OldText = oldTxt;
            m_NewText = newTxt;
        }

        public string OldText
        {
            get { return m_OldText; }
        }

        public string NewText
        {
            get { return m_NewText; }
        }
    }

    public delegate void SimpleTextBoxTextChange(object sender,SimpleTextBoxTextChangedEventArgs e);

    public class SimpleTextBox:WebControl,IPostBackDataHandler,IPostBackEventHandler
    {
        private const string textKey = "Text";
        private static readonly object textChangedKey = new object();
        private static readonly object postBackKey = new object();
        private string eventOldText;
        private string eventNewText;

        [Category("Action"), Description("This happens after changed!")]
        public event SimpleTextBoxTextChange TextChanged
        {
            add { Events.AddHandler(textChangedKey, value); }
            remove { Events.RemoveHandler(textChangedKey, value); }
        }

        protected void OnTextChanged(SimpleTextBoxTextChangedEventArgs e)
        {
            SimpleTextBoxTextChange handler = Events[textChangedKey] as SimpleTextBoxTextChange;
            if (handler != null)
                handler(this, e);
        }

        [Bindable(true), Category("Behavior"), DefaultValue(""), Description("text in textbox")]
        public string Text
        {
            get
            {
                object o = ViewState[textKey];
                return o == null ? String.Empty : (string)o;
            }
            set { ViewState[textKey] = value; }
        }

        [Category("Action"),Description("Nonsense")]
        public event EventHandler PostBackEvent
        {
            add { Events.AddHandler(postBackKey, value); }
            remove { Events.RemoveHandler(postBackKey, value); }
        }

        public void OnPostBackEvent(EventArgs e)
        {
            EventHandler handler = Events[postBackKey] as EventHandler;
            if (handler != null)
                handler(this, e);
        }

        protected override HtmlTextWriterTag TagKey
        {
            get
            {
                return HtmlTextWriterTag.Input;
            }
        }

        //protected override void OnPreRender(EventArgs e)
        //{
        //    if (Page != null)
        //        Page.RegisterRequiresPostBack(this);
        //    base.OnPreRender(e);
        //}

        protected override void Render(HtmlTextWriter writer)
        {
            if (Page != null)
                Page.VerifyRenderingInServerForm(this);
            base.Render(writer);
        }

        protected override void AddAttributesToRender(HtmlTextWriter writer)
        {
            base.AddAttributesToRender(writer);
            writer.AddAttribute(HtmlTextWriterAttribute.Name, UniqueID);                        
            writer.AddAttribute(HtmlTextWriterAttribute.Value, Text);
            writer.AddAttribute(HtmlTextWriterAttribute.Type, "text");
        }

        #region IPostBackDataHandler members

        public bool LoadPostData(string postDataKey, NameValueCollection postCollection)
        {
            eventOldText = Text;
            eventNewText = postCollection[UniqueID];
            bool hasChanged = (eventOldText != eventNewText);
            Text = eventNewText;
            Page.RegisterRequiresRaiseEvent(this);
            return hasChanged;
        }

        public void RaisePostDataChangedEvent()
        {
            OnTextChanged(new SimpleTextBoxTextChangedEventArgs(eventOldText, eventNewText));
        }

        #endregion

        #region IPostBackEventHandler members

        void IPostBackEventHandler.RaisePostBackEvent(string eventArgument)
        {
            OnPostBackEvent(EventArgs.Empty);
        }

        #endregion
    }
}

 当把SimpleTextBox一个以上数量的实例放置到页面上时,RaisePostBackEvent不执行,只有一个的时候却可以。

 

 

 

猜测并总结一下:

在一般情况下, IPostBackDataHandler 的方法由页面回传的Name去寻找控件并调用。当这种寻找并调用无法正常工作时,偏向于使用 Page.RegisterRequiresPostBack 将控件强行加入数据处理事件链中。

同样的,通常      IPostBackEventHandler 的方法由控件上的__doPostBack的脚本函数之类(这种函数多通过 Page.ClientScript.GetPostBackEventReference 和 Page.ClientScript.GetPostBackClientHyperlink来产生脚本调用代码)激发。 非正常情况可能就需要 Page.RegisterRequiresRaiseEvent的帮助

分享到:
评论

相关推荐

    【ASP.NET编程知识】ASP.NET服务器控件的生命周期分析.docx

    开发人员可以通过实现 System.Web.UI.IPostBackEventHandler 接口的 RaisePostBackEvent() 方法来实现该逻辑。 7. 预呈现阶段:在这个阶段中,服务器控件完成在生成控件之前所需要的任何工作。开发人员可以通过重写...

    ASP.NET服务器控件的生命周期分析.docx

    6. **处理回发事件**:在这个阶段,通过`IPostBackEventHandler`接口的`RaisePostBackEvent()`方法,处理导致回发的客户端事件,将客户端事件转化为服务器端事件处理。 7. **预呈现**:在控件实际呈现前,开发者...

    .net面试题大全

    - **处理回发事件 (Raise PostBack Event)**:对于实现了`IPostBackEventHandler`的控件,处理回发事件。 - **预呈现 (PreRender)**:此阶段,控件执行最后一次更新。 - **保存状态 (Save View State)**:保存当前...

    ASP.NET服务器控件封装-【事件】-1.1【事件回发.异步回调】[归纳].pdf

    自定义控件需要实现IPostBackDataHandler接口来支持回发事件处理。 异步回调则是另一种处理用户交互的方式。与事件回发不同,异步回调不会导致整个页面刷新,而是通过JavaScript和Ajax技术,仅更新页面的部分内容。...

    控件生命周期

    实现IPostBackEventHandler接口的控件可以通过这个事件来响应用户的动作,执行相应的事件处理代码。 #### 预渲染阶段(PreRender) PreRender阶段发生在页面渲染之前,是执行最后的数据绑定和逻辑处理的时机。在这...

    C# 面试常见问题编程类

    - **处理回发事件**(RaisePostBackEvent,如果实现了IPostBackEventHandler接口):执行回发事件处理。 - **预呈现**(OnPreRender):在控件呈现前执行最后的准备工作。 - **保存状态**(SaveViewState):保存...

    web服务器控件开发.ppt

    6. 处理回发事件:最后,服务器控件通过实现IPostBackEventHandler接口的RaisePostBackEvent()方法,将客户端事件映射到服务器端事件,以便在服务器端进行处理。 理解这些流程和生命周期对于有效地设计和调试ASP...

    asp日期控件

    在这个例子中,我们看到了对`IPostBackEventHandler`和`IPostBackDataHandler`接口的实现,这两个接口主要用于处理页面回发事件以及视图状态的加载和保存。 #### 3. 关键代码解读 ##### 3.1 初始化方法 ```csharp ...

    ASP.NET服务器控件的生命周期分析

    通过实现System.Web.UI.IPostBackEventHandler接口的RaisePostBackEvent()方法来映射客户端事件到服务器端的事件处理程序。控件将捕获回发事件并进行服务器端处理。 7. 预呈现阶段:在控件生成之前完成必要的工作。...

    庖丁解牛 纵向切入ASP.NET 3.5控件和组件开发 part1

    5.2.1 客户端回传事件接口ipostbackeventhandler 148 5.2.2 客户端回发/回调揭密 150 5.2.3 回传数据处理接口ipostbackdatahandler 153 5.2.4 正确处理继承基类中控件的事件 159 5.2.5 扩展kingtextbox控件功能...

    庖丁解牛 纵向切入ASP.NET 3.5控件和组件开发 part2

    5.2.1 客户端回传事件接口ipostbackeventhandler 148 5.2.2 客户端回发/回调揭密 150 5.2.3 回传数据处理接口ipostbackdatahandler 153 5.2.4 正确处理继承基类中控件的事件 159 5.2.5 扩展kingtextbox控件功能...

Global site tag (gtag.js) - Google Analytics