Как включить ajax при выводе из System.Web.UI.WebControls.WebControl для элементов управления, которые создаются внутри WebControl
Я создал класс, который является производным от System.Web.UI.WebControl. По сути, он отображает ссылки на страницы (так же, как вы видите на GridView, когда он включен) для использования над повторителем.
Я явно создаю некоторые якорные теги внутри своего элемента управления nav, но они не выполняют постбэки ajax. Насколько я понимаю, ajax требует POSTS для правильной работы? Ну, это были бы GET, которые, я думаю, являются проблемой.
Есть ли способ добиться того, что я пытаюсь сделать?
Спасибо!
2 ответа
Хорошо, я понял это. Я просто заставил мой класс реализовать IPostBackEventHandler. Это заставляет ваш элемент управления запускать событие, когда пользователь что-то предпринимает. В моем случае это щелчок по номеру навигационной страницы: [1][2][3][4][5][Next >]
Затем в моем рендере, где я создаю теги Anchor, я добавляю это к каждому href (pageStartRow отличается для каждого):
Параметры PostBackOptions = new PostBackOptions(this, pageStartRow.ToString()); writer.AddAttribute(HtmlTextWriterAttribute.Href, "javascript:" + Page.ClientScript.GetPostBackEventReference(options)); writer.RenderBeginTag(HtmlTextWriterTag.A);
Ключ должен передать что-то, что однозначно определяет, по какой ссылке они щелкнули. Это делается как второй параметр конструктора для класса PostBackOptions.
Затем я добавил следующие элементы в свой класс WebControl:
// Определяет событие Click. открытый делегат void ClickHandler(отправитель объекта, GridPagingNavClickedEventArgs e); публичное событие ClickHandler Click;
// Вызов делегатов, зарегистрированных с событием Click. защищенная виртуальная пустота OnClick (GridPagingNavClickedEventArgs e) {if (Click! = null) {Click (this, e); }}
public void RaisePostBackEvent (string eventArgument) {GridPagingNavClickedEventArgs e = new GridPagingNavClickedEventArgs (Convert.ToInt32 (eventArgument)); OnClick (е); }
GridPagingNavClickedEventArgs содержит один элемент (pageNumber в моем случае).
Наконец, на моей странице aspx (где я использую веб-контроль) я делаю это в Page_OnLoad:
gridNavTop.Click + = new GridPagingNavigation.ClickHandler (gridNavTop_Click);
и это код события:
private void gridNavTop_Click (отправитель объекта, GridPagingNavClickedEventArgs e) { StartRow = e.PageStartRow; }
Пока все находится внутри UpdatePanel, он работает отлично!
Чтобы воспользоваться этим преимуществом, вы должны унаследовать 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.