2009-08-06 82 views
0

我有一個相當長的問題,我很害怕。我對ASP.NET很新,所以請耐心等待。 我已經建立了一個ASP.NET頁面的控件,列出了一些選項。每個選項都有兩個可點擊的區域(爲簡單起見,稱它們爲按鈕)。一個選擇選項,另一個隱藏選項。ASP.NET觸發帶多個參數的服務器端事件


protected void Page_Load(object sender, EventArgs e) 
{ 
    RenderOptions(); 
} 

public void RenderOptions() 
{ 
    for (int i = 0; i < 5; i++) { 
    HtmlGenericControl div1 = new HtmlGenericControl("div"); 
    div1.Attributes.Add("onclick", ClientScript.GetPostBackEventReference(this, "option" + i)); 
    m_TreeContainer.Controls.Add(div1); 

    HtmlGenericControl div2 = new HtmlGenericControl("div"); 
    div2.Attributes.Add("onclick", ClientScript.GetPostBackEventReference(this, "option" + i)); 
    m_TreeContainer.Controls.Add(div2); 
    } 
} 

public void RaisePostBackEvent(string arg) 
{ 
    //do something 
} 

這工作正常(我實現IPostBackEventHandler接口)。這裏的問題在於,我似乎沒有辦法找到哪個HTML元素被點擊,因此應該在RaisePostBackEvent方法中執行哪個操作。

我試圖做的是創建一個新的類(HtmlDivControl),它看起來是這樣的:


class HtmlDivControl : HtmlGenericControl, IPostBackEventHandler 
{ 
    #region Delegates 
    public delegate void ClickEventHandler(object sender, string eventArgument); 
    #endregion 

    #region Properties 
    private ClickEventHandler m_Click; 
    public ClickEventHandler Click 
    { 
    get { return m_Click; } 
    set { m_Click = value; } 
    } 
    #endregion 

    #region Constructors 
    public HtmlDivControl() 
    { 
    } 
    #endregion 

    public void RaisePostBackEvent(string eventArgument) 
    { 
    m_Click.Invoke(this, eventArgument); 
    } 
} 

現在我做DIV1和DIV2我HtmlDivControl而非HtmlGenericControl中,單擊屬性設置爲一個方法(委託)並傳遞div(div1或div2)本身作爲GetPostBackEventReference方法的控件。這一次,我不僅可以區分不同的divs,還可以預先確定應該執行的操作。但是,控件的RaisePostBackEvent在PageLoad之後調用。所以我現在所面臨的問題是整個選項控件在處理事件之前就被渲染(因此,應該隱藏的選項並不是因爲實際的隱藏發生在渲染之後)。將RenderOptions()調用移動到PageLoadComplete方法也沒有幫助,因爲div控件將不存在。

我很確定我在這裏錯過了一些非常基本的東西。但是,有人可以解釋我應該如何處理這樣的事情嗎?

p.s. 我該如何在這裏寫下劃線?他們習慣使文本斜體?有一些逃生角色嗎?

+1

你想用這個控件做什麼?我的建議是遠離自定義控件類,如果你是新來的ASP.Net – John 2009-08-06 14:57:59

+0

Page_Load是微軟想出來的東西,而不是我:-)另外,這似乎不是一個很好的理由來打破使用一個非常有效的字符。但這是一個完全不同的討論。 @John:如果我要遠離自定義控件,那麼我將如何學習ASP.NET的更復雜的方面?澄清一下,我並沒有在ASP.NET或編程方面邁出第一步,只是我現在進入了一個我不完全熟悉的領域。根據我發佈的內容,您可能會看到我正朝着一個錯誤的方向前進。如果是這樣,請給我正確的方法。 – Jerry 2009-08-06 15:21:44

+0

我之前提到的原因是,除非您打算在其他項目中重新使用此控件,否則幾乎總是使用內置控件更簡單/更優雅的解決方案,或者至少通過創建UserControl – John 2009-08-06 16:24:46

回答

2

對於新來ASP.Net的人來說,目前爲止你做得相當不錯。這裏的障礙實際上就是你對這個問題的思考方式。你應該很好地掌握ASP.Net頁面生命週期 - 你錯過了一些非常基本的東西。

簡而言之,你希望你的頁面重建它的狀態,就像回發之前的狀態一樣。然後處理你的事件。然後進行任何狀態更改。

你在想它,就好像你的html控件應該知道它在請求開始時的狀態改變,這是不正確的。首先必須進行重建階段。這對ASP.Net甚至能夠找出要提出的事件至關重要。

我會建議他:

  1. 將您的 「RenderOptions()」 方法將Page_Init處理程序。如果您將ViewState整合到您的控件中,這將爲您節省很多問題。 (我也會重命名它,因爲它沒有真正呈現任何東西,只是將你的控件添加到頁面中.Redder在ASP.Net中有特定的上下文)。

  2. 然後,在您的控件的OnClick事件處理程序中,只需根據需要設置控件的可見性,而不是試圖控制它們的呈現方式。它始終是太多更簡單的將控件設置爲Visible = False,而不是試圖改變控件呈現給頁面的方式。請記住,如果您設置Visible = False,則會向該控件的響應發送零html,但服務器仍然知道它在頁面上,因此您仍然可以處理它。

想想你的事件處理程序是你要改變頁面狀態的地方。這是你的邏輯應該在這種情況下,而不是在Page_Load。

相關問題