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的帮助
分享到:
相关推荐
开发人员可以通过实现 System.Web.UI.IPostBackEventHandler 接口的 RaisePostBackEvent() 方法来实现该逻辑。 7. 预呈现阶段:在这个阶段中,服务器控件完成在生成控件之前所需要的任何工作。开发人员可以通过重写...
6. **处理回发事件**:在这个阶段,通过`IPostBackEventHandler`接口的`RaisePostBackEvent()`方法,处理导致回发的客户端事件,将客户端事件转化为服务器端事件处理。 7. **预呈现**:在控件实际呈现前,开发者...
- **处理回发事件 (Raise PostBack Event)**:对于实现了`IPostBackEventHandler`的控件,处理回发事件。 - **预呈现 (PreRender)**:此阶段,控件执行最后一次更新。 - **保存状态 (Save View State)**:保存当前...
自定义控件需要实现IPostBackDataHandler接口来支持回发事件处理。 异步回调则是另一种处理用户交互的方式。与事件回发不同,异步回调不会导致整个页面刷新,而是通过JavaScript和Ajax技术,仅更新页面的部分内容。...
实现IPostBackEventHandler接口的控件可以通过这个事件来响应用户的动作,执行相应的事件处理代码。 #### 预渲染阶段(PreRender) PreRender阶段发生在页面渲染之前,是执行最后的数据绑定和逻辑处理的时机。在这...
- **处理回发事件**(RaisePostBackEvent,如果实现了IPostBackEventHandler接口):执行回发事件处理。 - **预呈现**(OnPreRender):在控件呈现前执行最后的准备工作。 - **保存状态**(SaveViewState):保存...
6. 处理回发事件:最后,服务器控件通过实现IPostBackEventHandler接口的RaisePostBackEvent()方法,将客户端事件映射到服务器端事件,以便在服务器端进行处理。 理解这些流程和生命周期对于有效地设计和调试ASP...
在这个例子中,我们看到了对`IPostBackEventHandler`和`IPostBackDataHandler`接口的实现,这两个接口主要用于处理页面回发事件以及视图状态的加载和保存。 #### 3. 关键代码解读 ##### 3.1 初始化方法 ```csharp ...
通过实现System.Web.UI.IPostBackEventHandler接口的RaisePostBackEvent()方法来映射客户端事件到服务器端的事件处理程序。控件将捕获回发事件并进行服务器端处理。 7. 预呈现阶段:在控件生成之前完成必要的工作。...
5.2.1 客户端回传事件接口ipostbackeventhandler 148 5.2.2 客户端回发/回调揭密 150 5.2.3 回传数据处理接口ipostbackdatahandler 153 5.2.4 正确处理继承基类中控件的事件 159 5.2.5 扩展kingtextbox控件功能...
5.2.1 客户端回传事件接口ipostbackeventhandler 148 5.2.2 客户端回发/回调揭密 150 5.2.3 回传数据处理接口ipostbackdatahandler 153 5.2.4 正确处理继承基类中控件的事件 159 5.2.5 扩展kingtextbox控件功能...