C# 如何在WebControl内部创建的控件上从System.Web.UI.WebControl.WebControl派生时启用ajax

C# 如何在WebControl内部创建的控件上从System.Web.UI.WebControl.WebControl派生时启用ajax,c#,asp.net,custom-controls,system.web.ui.webcontrols,C#,Asp.net,Custom Controls,System.web.ui.webcontrols,我构建了一个从System.Web.UI.WebControl派生的类。当在中继器上启用时,它基本上呈现分页链接,与您在GridView顶部看到的内容相同 显然,我在nav控件中显式地创建了一些锚定标记,但它们不执行ajax回发。我的理解是,ajax需要帖子才能正常工作?嗯,我想这就是问题所在 有没有办法实现我的目标 谢谢 要利用这一优势,您必须继承ICallbackEventHandler并实现其方法,如下所示 public class CtlTest : WebControl, ICallb

我构建了一个从System.Web.UI.WebControl派生的类。当在中继器上启用时,它基本上呈现分页链接,与您在GridView顶部看到的内容相同

显然,我在nav控件中显式地创建了一些锚定标记,但它们不执行ajax回发。我的理解是,ajax需要帖子才能正常工作?嗯,我想这就是问题所在

有没有办法实现我的目标


谢谢

要利用这一优势,您必须继承ICallbackEventHandler并实现其方法,如下所示

public class CtlTest : WebControl, ICallbackEventHandler
{

    private static readonly object EventClick = new object();

    public CtlTest() : base(HtmlTextWriterTag.A) { }

    public event EventHandler Click
    {
        add { base.Events.AddHandler(EventClick, value); }
        remove { base.Events.RemoveHandler(EventClick, value); }
    }

    protected override void AddAttributesToRender(HtmlTextWriter writer)
    {
        base.AddAttributesToRender(writer);
        writer.AddAttribute(HtmlTextWriterAttribute.Href, "javascript:" + this.Page.ClientScript.GetCallbackEventReference(this, null, "null", null));
    }

    protected override void RenderContents(HtmlTextWriter writer)
    {
        base.RenderContents(writer);
        writer.Write("Submit Query");
    }

    protected virtual void OnClick(EventArgs e)
    {
        EventHandler handler = this.Events[EventClick] as EventHandler;
        if (handler != null)
            handler(this, e);
    }

    #region ICallbackEventHandler Members

    string ICallbackEventHandler.GetCallbackResult()
    {
        return string.Empty;
    }

    void ICallbackEventHandler.RaiseCallbackEvent(string eventArgument)
    {
        this.OnClick(EventArgs.Empty);
    }

    #endregion

}

虽然您正在使用数据寻呼机控件,并且需要更新页面的某些部分,但最好编写一个不支持Ajax的控件,并将其及其相关控件放在UpdatePanel中。

好的,我已经解决了。我只是让我的类实现IPostBackEventHandler。这会使控件在用户对某个对象执行操作时触发事件。在我的例子中,它是单击导航页码:[1][2][3][4][5][Next>]

然后,在我创建锚定标记的渲染中,我将此添加到每个href页面StartRow,每个页面都不同:

PostBackOptions options=新的PostBackOptions此,pageStartRow.ToString; writer.AddAttributeHtmlTextWriterAttribute.Href,javascript:+Page.ClientScript.GetPostBackEventReferenceoptions; writer.RenderBeginTagHtmlTextWriterTag.A

关键是传递能够唯一标识他们单击的链接的内容。这是作为PostBackOptions类的第二个构造函数参数完成的

然后,我在WebControl类中添加了以下项目:

//定义单击事件。 公共委托无效ClickHandler对象发送者,网格分页导航ClickedEventTarget e; 公共事件ClickHandler Click

//调用使用Click事件注册的委托。 单击GridPagingNavClickedEventargs e时受保护的虚拟空 { 如果单击!=null { 点击这个,e; } }

public void RaisePostBackEventstring事件参数 { GridPagingNavClickedEventArgs e=新的GridPagingNavClickedEventArgsConvert.ToInt32Event参数; onclick; }

在我的案例中,GridPagingNavClickedEventArgs包含一个项目页码

最后,在我使用webcontrol的aspx页面中,我在页面加载中执行以下操作:

gridNavTop.Click+=新建GridPagingNavigation.ClickHandlergridNavTop\u单击

这是事件代码:

私有无效gridNavTop\u单击对象发送方,GridPagingNavClickedEventArgs e { StartRow=e.PageStartRow; }


只要一切都在UpdatePanel中,那么它就可以完美地工作

谢谢你的回复!我对此有点困惑。。。你是说有更简单的方法?你的最后一句话似乎表明了这一点。我所要做的就是让链接触发ajax刷新,而不是整页刷新。是,单击链接可刷新页面的其他部分。另外,我不确定上面的CtlTest类为什么调用baseHtmlTextWriterTag.A???我的网络控制有一系列链接,不仅仅是一个…@Dave,你说得对,这是我的错。上面的代码只是一个简单的示例,说明了如何使用“ICallbackEventHandler”界面创建一个简单的支持ajax的链接按钮。正如我前面提到的,在编写支持ajax的完整数据寻呼机控件时,最好将控件放在更新面板中。然而,您必须更新与数据寻呼机关联的中继器控件。嗨,Mehdi,我的网络控件已经在UpdatePanel中,但它仍然无法工作。我真的明白了。。。我下一步会回答我的问题。谢谢你在这方面的帮助!