【问题标题】:ASP.NET: How to process postback events for my own control?ASP.NET:如何为我自己的控件处理回发事件?
【发布时间】:2010-02-19 07:00:57
【问题描述】:

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

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

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

我错过了什么?

什么可能导致问题?

更新: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。我查了一下,这个脚本正在被调用。

【问题讨论】:

  • @Artem,请说明您是如何注册回发脚本的?这是您的控件的一般结构。

标签: asp.net asp.net-ajax postback custom-controls


【解决方案1】:

你能告诉我们第一个控件的源代码吗?反正有一个简单的例子。

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
    }

}

编辑

  1. 为什么您要不受控制地手动生成回发脚本?你必须使用Page.ClientScript.GetPostBackEventReference 方法。它为页面生成并包含一些必要的内联和嵌入脚本。

  2. 为什么要从 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();
    }

}

【讨论】:

  • 我没有输入,它只是一个对某些 onclick() 事件作出反应的控件。
【解决方案2】:

我猜这是“作为子控件动态添加到 Control2”的问题,但没有任何代码很难诊断。

您在页面生命周期中的什么时候动态添加它?您是否在回发后以完全相同的方式使用相同的 ID 重新创建动态控件?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    相关资源
    最近更新 更多