gpt4 book ai didi

ASP.NET:如何为我自己的控件处理回发事件?

转载 作者:行者123 更新时间:2023-12-04 06:58:07 24 4
gpt4 key购买 nike

我有自己的 Control1,它作为子控件动态添加到 Control2,它在 control2 的 CreateChildControls() 中实现 INamingContainer。

Control1 本身实现 IPostBackEventHandler。但是尽管我确实从 JavaScript 调用回发方法,但从未在 Control1 上调用 RaisePostBackEvent() 方法。

是的,还有其他控件在页面上实现 IPostBackEventHandler 接口(interface)。

我错过了什么?

什么可能导致问题?

更新: Control1 始终以完全相同的方式创建并在 Control2 中分配完全相同的 ID

在 Control2 中看起来像这样:

protected override void CreateChildControls()
{
if(!this.DesignMode)
{
Control1 c = new Control1();
c.ID = "FIXED_ID";
}
base.CreateChildControls();
}

更新2:
控制1:
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。

更新3:

在某些 onClick 事件的 JavaScript 中,我执行以下操作:
__doPostBack(Control1.UniqueID,'commandId=MyCommand');

其中 Control1.UniqueID 在渲染过程中当然会替换为真实的 uniqueID。我检查了,这个脚本正在被调用。

最佳答案

你能告诉我们第一个控件的源代码吗?无论如何,有一个简单的例子。

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方法。它为页面生成并包含一些必要的内联和嵌入脚本。
  • 为什么你的类(class)来自 Control ?这对于那些没有任何用户界面的控件很有用。

  • 来自 MSDN

    This is the primary class that you derive from when you develop custom ASP.NET server controls. Control does not have any user interface (UI) specific features. If you are authoring a control that does not have a UI, or combines other controls that render their own UI, derive from Control. If you are authoring a control that does have a UI, derive from WebControl or any control in the System.Web.UI.WebControls namespace that provides an appropriate starting point for your custom control.



    您必须从 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();
    }

    }

    关于ASP.NET:如何为我自己的控件处理回发事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2294601/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com