我有自己的Control1,它作为子控件动态添加到Control2,它在control2的CreateChildControls()中实现了INamingContainer。
Control1本身实现了IPostBackEventHandler。但是从不在Control1上调用RaisePostBackEvent()方法,尽管我从JavaScript调用了回发方法。
是的,还有其他控件在页面上实现了IPostBackEventHandler接口。
我错过了什么?
什么可能导致问题?
更新:Control1始终以完全相同的方式创建,并在Control2中分配完全相同的ID
在Control2中看起来像这样:
protected override void CreateChildControls()
{
if(!this.DesignMode)
{
Control1 c = new Control1();
c.ID = "FIXED_ID";
}
base.CreateChildControls();
}
UPDATE2: CONTROL1:
public class Control1: Control, IPostBackEventHandler
{
...
protected virtual void RaisePostBackEvent(string eventArgument)
{
if(!String.IsNullOrEmpty(eventArgument))
{
// Some other code
}
}
}
如果我添加行
Page.RegisterRequiresRaiseEvent(c);
在Control2中的CreateChildControls()中,正在调用此方法但始终使用null eventArgument。
UPDATE3:
在一些onClick事件的JavaScript中,我执行以下操作:
__doPostBack(Control1.UniqueID,'commandId=MyCommand');
其中Control1.UniqueID当然在渲染过程中用真实的uniqueID替换。我查了一下,这个脚本正在调用。
答案 0 :(得分:3)
您能告诉我们第一个控件的源代码吗?无论如何,有一个简单的例子。
public class TestControl2 : CompositeControl
{
protected override void CreateChildControls()
{
base.CreateChildControls();
if (!DesignMode)
this.Controls.Add(new TestControl());
}
}
public class TestControl : WebControl, IPostBackEventHandler
{
public TestControl() : base(HtmlTextWriterTag.Input) { }
protected override void AddAttributesToRender(HtmlTextWriter writer)
{
base.AddAttributesToRender(writer);
writer.AddAttribute(HtmlTextWriterAttribute.Type, "button");
writer.AddAttribute(HtmlTextWriterAttribute.Name, base.UniqueID);
writer.AddAttribute(HtmlTextWriterAttribute.Onclick, Page.ClientScript.GetPostBackEventReference(this, null));
writer.AddAttribute(HtmlTextWriterAttribute.Value, "Submit Query");
}
void IPostBackEventHandler.RaisePostBackEvent(string eventArgument)
{
// Raise post back event
}
}
修改强>
为什么要从控件中手动生成回发脚本并手动生成?您必须使用Page.ClientScript.GetPostBackEventReference
方法。它为页面生成并包含一些必要的内联和嵌入脚本。
为什么要从Control
派生您的课程?这对那些没有任何用户界面的控件很有用。
来自MSDN
这是你的主要课程 源于您开发自定义的时间 ASP.NET服务器控件。控制呢 没有任何用户界面(UI) 具体功能。如果你是 创作一个没有的控件 UI,或组合其他控件 渲染自己的UI,派生自 控制。如果你正在创作一个 导出具有UI的控件 来自WebControl或其中的任何控件 System.Web.UI.WebControls命名空间 这提供了一个合适的起点 指向您的自定义控件。
您必须从WebControl
类派生您的控件,如下所示。
public class TestCtl : WebControl, IPostBackEventHandler
{
protected override void AddAttributesToRender(HtmlTextWriter writer)
{
base.AddAttributesToRender(writer);
// Add onclick event.
writer.AddAttribute(HtmlTextWriterAttribute.Onclick, Page.ClientScript.GetPostBackEventReference(this, "Arguments"));
}
void IPostBackEventHandler.RaisePostBackEvent(string eventArgument)
{
throw new NotImplementedException();
}
}
答案 1 :(得分:0)
我猜这是“动态添加为Control2的子控件”这就是问题,但是没有任何代码就很难诊断出来。
在页面生命周期中,您是否动态添加它?在回发后,您是否以完全相同的方式重新创建动态控件,具有相同的ID?