2011-03-18 44 views
0

在儀表板頁面上,我動態加載了幾個控件;控件總是需要加載,所以沒有if (!Page.IsPostBack)代碼。但問題在於,在代碼隱藏方面,我們使用Request.Form.GetValues,並且特定的下拉字段值始終爲空(大概是因爲控件正在清除並在回發中重新加載),並且這會在頁面中稍後觸發錯誤這預示着這個下拉列表中的一個值。我必須使用Request.Form.GetValues,因爲頁面可以通過Javascript動態添加行(每行包含5個HTML輸入)。動態加載控件和回發

如果我檢查回發,則控件的按鈕事件根本不會觸發,而是重新加載儀表板頁面,並且根本沒有加載控件(即頁面爲空白)。

我該如何解決這個問題?我需要隨時動態加載控件,但我也需要通過Request.Form.GetValues檢索值。有什麼建議麼?

編輯

下面的代碼是什麼樣子,大致爲:

(客戶端HTML)

<table> 
    <tr> 
     <td align="center"> 
      <select id="Class1" class="txtboxcomm" name="Class1" runat="server" /> 
      <a href="javascript:classFinder('1')">&nbsp;Look Up</a> 
     </td> 
    </tr>  
</table> 
<div id="action"> 
    <asp:LinkButton ID="ibtnGetQuote" runat="server" OnClick="ibtnGetQuote_Click" CssClass="getQuote" AccessKey="G">Get Quote</asp:LinkButton> 
</div> 

(服務器端,在ibtnGetQuote_Click - 這其實是一個循環因爲用戶可以追加多行;「我」被追加到單詞「類」以找到確切的行)

IList<string> classes = this.GetFormValues("Class1"); 

// This will return null all the time... 
private IList<string> GetFormValues(string clientID) 
{ 
    String[] values; 
    values = Request.Form.GetValues(clientID); 
    if (values == null) 
    { 
     Control ctl = FindControl(clientID); // uses built-in FindControl method 
     values = Request.Form.GetValues(ctl.ClientID); 
    } 
    return values; 
} 

原始代碼硬編碼「ctl00 $ xx $ xx」的東西,但控件可能會或可能不會被加載,所以我們無法保證控件的名稱。事實上,我甚至不確定這是否適用於所有情況,因爲只有FIRST控件是服務器控件,其餘的只是標準的HTML控件,因此不會有「ClientID」。

+0

您的措辭給人的印象只有許多控制之一是有這個問題。這是正確的,還是都是動態控制遇到這種行爲? – 2011-03-18 19:13:38

+0

就空值而言,它只是在客戶端附加行的控件上,因爲第一行是實際的服務器控件(即具有ASP.NET ctl00_ $ Stuff_ $ Stuff類型命名)和Request.Form .GetValues爲該控件返回null。 – 2011-03-18 19:21:50

回答

0

看來你正在加載Load事件中的控件。現在已經處理完視圖狀態,這太遲了。您需要在Init事件中加載控件。

+0

控件正在OnInit中動態加載,但它們正在被初始化爲Page_Load中的一些默認值。 – 2011-03-18 19:07:18

+0

你能發佈一個小樣本,可能只是一個動態控件(比如下拉菜單)。 – 2011-03-18 19:16:14

+0

發表了一些代碼。 – 2011-03-18 19:32:10

0

什麼可能是一個好主意是儘快加載控件以將它們添加到控件樹中。如果可以在觸發LoadViewState方法之前執行此操作,則控件應像處理任何靜態聲明的控件一樣處理視圖狀態。

+0

那會是什麼時候?我已經嘗試過OnInit和InitComplete,但該值仍然從Request.Form.GetValues返回爲null。 – 2011-03-18 19:15:24

0

在CreateChildControls事件中控制創建和填充。在檢查表單之前調用EnsureChildControls()。

+0

試過了;控件初始化自定義方法沒有被觸發,所需的默認值(下拉選項等)未被設置。初始化在Page_Load中調用;它應該在別的地方嗎? – 2011-03-18 19:18:03

+0

呃..是的,它應該在CreateChildControls中。 – 2011-03-22 14:15:05