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