如何在WebControl中创建的控件上从System.Web.UI.WebControls.WebControl派生时启用ajax

时间:2010-02-26 07:33:01

标签: c# asp.net custom-controls system.web.ui.webcontrols

我已经构建了一个派生自System.Web.UI.WebControl的类。它基本上呈现分页链接(与启用时在GridView上看到的相同),以便在转发器上方使用。

我明显在导航控件中明确创建了一些锚标签,但是他们没有执行ajax回发。我的理解是ajax要求POSTS正常工作?好吧,这些将是GET,我认为是问题。

有没有办法实现我想要做的事情?

谢谢!

2 个答案:

答案 0 :(得分:0)

要发挥这一优势,您必须继承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中。

答案 1 :(得分:0)

好的,我明白了。我只是让我的类实现了IPostBackEventHandler。这使得您的控件在用户对某些内容执行操作时触发事件。在我的例子中,它点击一个导航页面编号:[1] [2] [3] [4] [5] [下一个>]

然后,在我创建Anchor标签的渲染中,我将其添加到每个href(pageStartRow对于每个href都不同):

PostBackOptions options = new PostBackOptions(this,pageStartRow.ToString()); writer.AddAttribute(HtmlTextWriterAttribute.Href,“javascript:”+ Page.ClientScript.GetPostBackEventReference(options)); writer.RenderBeginTag(HtmlTextWriterTag.A);

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

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

//定义Click事件。 public delegate void ClickHandler(object sender,GridPagingNavClickedEventArgs e); 公共事件ClickHandler Click;

//调用使用Click事件注册的委托。 protected virtual void OnClick(GridPagingNavClickedEventArgs e) {     if(Click!= null)     {         点击(this,e);     } }

public void RaisePostBackEvent(string eventArgument) {     GridPagingNavClickedEventArgs e = new GridPagingNavClickedEventArgs(Convert.ToInt32(eventArgument));     的OnClick(E); }

GridPagingNavClickedEventArgs包含一个项目(在我的情况下为pageNumber)。

最后,在我的aspx页面(我使用webcontrol)中,我在Page_OnLoad中执行此操作:

gridNavTop.Click + = new GridPagingNavigation.ClickHandler(gridNavTop_Click);

这是事件代码:

private void gridNavTop_Click(object sender,GridPagingNavClickedEventArgs e) {     StartRow = e.PageStartRow; }

只要所有内容都在UpdatePanel中,它就能完美运行!