我已經構建了一個派生自System.Web.UI.WebControl的類。它基本上呈現分頁鏈接(與啓用時在GridView上看到的一樣),以便在中繼器上方使用。如何啓用ajax從System.Web.UI.WebControls.WebControl派生在WebControl內部創建的控件
顯然,在我的導航控件內部創建了一些錨標籤,但他們不執行ajax回發。我的理解是,ajax需要POSTS才能正常工作?那麼,這些將是我認爲是問題的GET。
有沒有辦法實現我想要做的?
謝謝!
我已經構建了一個派生自System.Web.UI.WebControl的類。它基本上呈現分頁鏈接(與啓用時在GridView上看到的一樣),以便在中繼器上方使用。如何啓用ajax從System.Web.UI.WebControls.WebControl派生在WebControl內部創建的控件
顯然,在我的導航控件內部創建了一些錨標籤,但他們不執行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>]
然後,在我創建錨標記的render中,我將它添加到href(pageStartRow每個都不相同):
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事件註冊的代理。 (點擊!=空) { Click(this,e); } }
公共無效RaisePostBackEvent(串eventArgument) { GridPagingNavClickedEventArgs E =新GridPagingNavClickedEventArgs(Convert.ToInt32(eventArgument)); OnClick(e); }
GridPagingNavClickedEventArgs包含單個項目(pageNumber在我的情況)。
最後,在我的aspx頁面(這裏我用的是三夏),我這樣做的Page_OnLoad:
gridNavTop。點擊+ = new GridPagingNavigation.ClickHandler(gridNavTop_Click);
,這是事件代碼:
私人無效gridNavTop_Click(對象發件人,GridPagingNavClickedEventArgs E) { STARTROW = e.PageStartRow; }
只要一切都在UpdatePanel中,那麼它就可以完美地工作!
感謝您的回覆!我對此有點困惑......你是說有一種更簡單的方法來做到這一點?你最後一句話似乎表明了這一點。我所要做的就是讓鏈接觸發ajax刷新,而不是整個頁面刷新。是的,點擊鏈接刷新頁面的其他部分。 此外,我不知道爲什麼上面的CtlTest類調用基地(HtmlTextWriterTag.A)???我的WebControl有一系列的鏈接,不只是一個... – Dave 2010-03-02 05:57:26
@Dave,你說得對,這是我的不好。上面的代碼只是一個簡單的例子,說明了如何使用'ICallbackEventHandler'接口創建一個簡單的啓用Ajax的鏈接按鈕。正如我上面提到的那樣,IMO最好把你的控制放在更新面板中,編寫一個完整的支持Ajax的數據呼叫器控制。而您必須更新與數據尋呼機關聯的中繼器控制。 – 2010-03-02 08:02:22
嗨Mehdi, 我的webcontrol已經在UpdatePanel中,但它仍然無法工作。我其實已經想通了......接下來回答我的問題。感謝您的幫助! – Dave 2010-03-02 21:46:22