1

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

显然,我在导航控件中明确地创建了一些锚标记,但它们不执行 ajax 回发。我的理解是 ajax 需要 POSTS 才能正常工作?好吧,这些将是我认为是问题的 GET。

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

谢谢!

4

2 回答 2

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 中。

于 2010-02-26T09:41:11.973 回答
0

好的,我想通了。我只是让我的班级实现了 IPostBackEventHandler。当用户对某事采取行动时,这会使您的控件触发一个事件。就我而言,它正在单击导航页码:[1][2][3][4][5][Next >]

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

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

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

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

// 定义点击事件。公共委托无效 ClickHandler(对象发送者,GridPagingNavClickedEventArgs e);公共事件 ClickHandler 点击;

//调用使用 Click 事件注册的委托。受保护的虚拟 void OnClick(GridPagingNavClickedEventArgs e) { if (Click != null) { Click(this, e); } }

公共无效 RaisePostBackEvent(字符串 eventArgument) { GridPagingNavClickedEventArgs e = new GridPagingNavClickedEventArgs(Convert.ToInt32(eventArgument)); 点击(e);}

GridPagingNavClickedEventArgs 包含一个项目(在我的例子中是 pageNumber)。

最后,在我的 aspx 页面(我使用 web 控件的地方)中,我在 Page_OnLoad 中执行此操作:

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

这是事件代码:

私人无效gridNavTop_Click(对象发送者,GridPagingNavClickedEventArgs e){StartRow = e.PageStartRow;}

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

于 2010-03-02T21:59:05.227 回答