2009-08-26 46 views
0

所以我遇到了一個.aspx頁面和一些服務器端代碼的問題,我得到了意想不到的結果。C#.Net變量意外重新啓動

這個頁面的目標很簡單,有5個單選按鈕和一個帶有服務器端onclick函數的按鈕。這個想法是用戶選擇5個單選按鈕中的1個,然後點擊按鈕。點擊按鈕後,我驗證(不使用表單驗證,因爲我想要一種不同的感覺)檢查按鈕,然後將選定的選項存儲在數據庫中。

由於事實單選按鈕的數量可能在未來,我決定嘗試和單選按鈕的抽象數更改爲使其更容易在我的自我改變未來。

因此,在我的服務器端代碼的頂部,我創建了一個可能的選項列表。

然後我有一個registerVote函數,它在一個單選按鈕對象,以及一些搶從配置文件中的設置。我將這兩個值放入一個包裝類中,然後將它們添加到可能的選項列表中。

最後按下提交按鈕的時候,我經歷了所有可能的選項進行迭代,看看哪一個被選中,並抓住它的關聯值。

public partial class VotePanel : System.Web.UI.Page 
{ 
    List<VoteOption> voteOptions = new List<VoteOption>(); 

    public string registerVote(RadioButton newRadioButton, int voteOption) 
    { 
     voteOptions.Add(new VoteOption(newRadioButton, voteOption)); 
     return ConfigurationManager.AppSettings["vote_option_" + voteOption]; 
    } 

    protected void Submit_Click(object sender, EventArgs e) 
    { 
     //Check vote 
     string vote_value = ""; 
     bool someButtonChecked = false; 

     foreach (VoteOption vo in voteOptions) 
     { 
      if (!someButtonChecked && vo.button.Checked) 
      { 
       vote_value = vo.movie; 
       someButtonChecked = true; 
      } 
     } 
     //.... 
    } 
} 

class VoteOption 
{ 
    public RadioButton button; 
    public int vote_value; 

    public VoteOption(RadioButton r, int v) 
    { 
     button = r; 
     vote_value= v; 
    } 
} 

我在頁面中使用的代碼添加一個單選按鈕,看起來像這樣

<的asp:單選按鈕ID = 「RadioButton1」 RUNAT = 「服務器」 組名= 「投票」 的風格=「的位置是:相對; top:3px;「/> <%= registerMovie(RadioButton1,1)%>

現在爲我遇到的問題。每當提交按鈕被點擊時,列表的計數爲零,看起來像已經重新初始化。我通過在registerVote方法中返回列表計數來確認值正在被添加,並且確實正在添加對象,但出於某種原因,提交功能不可用。

現在像這樣的頁面上的變量不應該重新初始化?我也測試了一個字符串,它沒有重置,並且可用於提交按鈕。我所做的是定義一個類變量字符串time = DateTime.Now.Ticks.toString();並顯示點擊提交按鈕後,時間總是相同的,無論我點擊了多少次。

那麼,爲什麼我的列表將重新初始化,但不是一個字符串?有任何想法嗎?

+0

你什麼時候打電話給'registerVote'?你可以發佈該代碼嗎? – jscharf 2009-08-26 15:44:57

回答

0

我沒有在您的代碼中看到您正在構建的列表放置在內存中的任何地方。我相信你正在重新載入每一頁。附:可能是我的閱讀,但你創建了一個名爲registerVote的函數,並且你正在調用一個名爲registerMovie的方法,這可能是你的問題。

您可以將列表放置在會話中並從會話中取回。

Personnally我會改變的代碼 1)檢查列表是在內存中,並得到它。如果不在內存中調用一個方法來生成一次,然後將其放置在內存中。 2)在你的頁面上使用一個RadioButtonList,然後你可以綁定到你的列表作爲數據源。

1

這個問題似乎是你正在構建列表<VoteOption> voteOptions在頁面呈現然後期待它仍然在回發。 Page對象在頁面傳遞給瀏覽器的時候並不存在,所以當瀏覽器接收到頁面時,您的投票選項列表也會被丟棄。

你要麼需要之前或期間Submit_Click重建上回發的voteOption列表,或者給自己的單選按鈕,你不需要它的價值足夠的信息。

0

asp.net是無狀態的,所以每次回傳(如點擊提交)重新創建服務器端類。如果您希望列表在呼叫之間保持不變,則應將其保存在ViewState或隱藏字段中。不確定的字符串雖然;你所描述的不適合asp.net的生命週期。

2

請記住,您的頁面類將針對每個請求構建和銷燬 - 每個頁面加載之間不會保持狀態,您需要根據需要正確重新創建狀態。在這種情況下,在調用Submit_Click之前,您的列表voteOptions未被重新創建。

你必須無論頁面是否在回發或不註冊頁面Page_LoadOnInit處理內部,所有的投票選項。這將重建voteOptions,然後將調用Submit_Click時訪問。請參閱ASP.NET Page Life Cycle