2010-02-26 18 views
1

我已經構建了一個派生自System.Web.UI.WebControl的類。它基本上呈現分頁鏈接(與啓用時在GridView上看到的一樣),以便在中繼器上方使用。如何啓用ajax從System.Web.UI.WebControls.WebControl派生在WebControl內部創建的控件

顯然,在我的導航控件內部創建了一些錨標籤,但他們不執行ajax回發。我的理解是,ajax需要POSTS才能正常工作?那麼,這些將是我認爲是問題的GET。

有沒有辦法實現我想要做的?

謝謝!

回答

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

+0

感謝您的回覆!我對此有點困惑......你是說有一種更簡單的方法來做到這一點?你最後一句話似乎表明了這一點。我所要做的就是讓鏈接觸發ajax刷新,而不是整個頁面刷新。是的,點擊鏈接刷新頁面的其他部分。 此外,我不知道爲什麼上面的CtlTest類調用基地(HtmlTextWriterTag.A)???我的WebControl有一系列的鏈接,不只是一個... – Dave 2010-03-02 05:57:26

+0

@Dave,你說得對,這是我的不好。上面的代碼只是一個簡單的例子,說明了如何使用'ICallbackEventHandler'接口創建一個簡單的啓用Ajax的鏈接按鈕。正如我上面提到的那樣,IMO最好把你的控制放在更新面板中,編寫一個完整的支持Ajax的數據呼叫器控制。而您必須更新與數據尋呼機關聯的中繼器控制。 – 2010-03-02 08:02:22

+0

嗨Mehdi, 我的webcontrol已經在UpdatePanel中,但它仍然無法工作。我其實已經想通了......接下來回答我的問題。感謝您的幫助! – Dave 2010-03-02 21:46:22

0

好吧,我想通了。我只是讓我的類實現了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中,那麼它就可以完美地工作!

相關問題