簡體   English   中英

在 C# Web 表單中單擊 [確定] 后,如何在 .aspx 頁面之間傳遞變量

[英]How do I pass variable between .aspx pages after clicking [OK] in a C# web form

我是網絡表單的新手。

1) 我的默認網頁表單是 Default.aspx。 它有幾個組合框和一個 Button 控件:所有 ASP.Net Web 控件。

2) 在 Page_load() 中,我創建了一個 C# 對象“ScoringInfo()”:

protected void Page_Load(object sender, EventArgs e)
    {
        scoringInfo = new ScoringInfo();
        ...

3) ScoringInfo 從數據庫中讀取一些信息到成員變量中,並使用成員變量填充組合框:

scoringInfo.GetOpenCrossByDate(dt, openCrossInfo);
    cbAvailableBowlers.Items.Clear ();
    foreach (OpenCrossInfoRec rec in openCrossInfo)
      string s =
        String.Format(
          "Lane {0:00}: {1}",
          rec.laneNo, rec.dateTime);
      cbAvailableBowlers.Items.Add(s);
      ...

4)這里是成員變量:

...
  protected ScoringInfo scoringInfo;
  protected List leagueInfo = new List();
  protected List openCrossInfo = new List();

5) 當用戶按下按鈕時,我想顯示第二個 .aspx 頁面,該頁面處理用戶選擇的特定組合框項目。 這是我的“OnClick”事件處理程序:

protected void bTest_Click1(object sender, EventArgs e)
        {
          int idx = cbAvailableBowlers.SelectedIndex;
          Session["openCrossLaneUniqueId"] = openCrossInfo[idx].laneUniqueId;
          ...// THIS FAILS:
             // "ARGUMENT OUT OF RANGE" exception;
             // "idx" is 0; openCrossInfo[] list is empty...

它不起作用......因為在執行 bTest_Click1 時,成員變量“openCrossInfo[]”和組合框屬性 SelectedIndex 似乎不再有效!

如何/在哪里為同一會話中的其他后續頁面保存 UI 狀態?

以下是在網頁之間傳遞數據的五種方法:

http://www.itorian.com/2012/07/5-ways-to-send-data-between-aspnet-pages.html

頁面的成員變量(例如 openCrossInfo)不會從請求到請求持續存在。 每次收到新請求時,都會再次創建 .aspx 的 Page 對象。因此,當 bTest_Click 的事件觸發時,它正在使用 Page 對象的新副本。 您的 openCrossInfo 數組沒有值,因為頁面對象剛剛創建,即使您在較早的請求中設置了它。

如果您想保存狀態,則必須使用其他內容,例如會話狀態。

正如 Jay Douglass 指出的那樣,問題在於原始頁面的成員變量“openCrossInfo”沒有保留到新的“回發”頁面。

解決方案是:

  1. 創建並初始化原始頁面中的對象(“if !IsPostBack”),將初始化的對象保存到Session中,然后
  2. 從后續頁面的會話中恢復它們:


protected void Page_Load(object sender, EventArgs e)
{
    scoringInfo = new ScoringInfo();
    if (!IsPostBack)
    {
        // 1st time, use current date/time; create new data
        leagueInfo = new List<LeagueInfoRec>();
        openCrossInfo = new List<OpenCrossInfoRec>();
        laneUniqueIds = new List<string>();
        updateGui(DateTime.Now);
        Session["leagueInfo"] = leagueInfo;
        Session["openCrossInfo"] = openCrossInfo;
        Session["laneUniqueIds"] = laneUniqueIds;
    }
    else
    {
        // Subsequent callbacks: retrieve state
        leagueInfo = (List<LeagueInfoRec>)Session["leagueInfo"];
        openCrossInfo = (List<OpenCrossInfoRec>)Session["openCrossInfo"];
        laneUniqueIds = (List<string>)Session["laneUniqueIds"];
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM