我构建了一个派生自 System.Web.UI.WebControl 的类。它基本上呈现分页链接(与启用时在 GridView 顶部看到的相同)以在中继器上方使用。
显然,我在导航控件中明确地创建了一些锚标记,但它们不执行 ajax 回发。我的理解是 ajax 需要 POSTS 才能正常工作?好吧,这些将是我认为是问题的 GET。
有没有办法实现我想要做的事情?
谢谢!
我构建了一个派生自 System.Web.UI.WebControl 的类。它基本上呈现分页链接(与启用时在 GridView 顶部看到的相同)以在中继器上方使用。
显然,我在导航控件中明确地创建了一些锚标记,但它们不执行 ajax 回发。我的理解是 ajax 需要 POSTS 才能正常工作?好吧,这些将是我认为是问题的 GET。
有没有办法实现我想要做的事情?
谢谢!
要利用这一优势,您必须继承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(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 中,它就可以完美运行!