【问题标题】:How do I pass variable between .aspx pages after clicking [OK] in a C# web form在 C# Web 表单中单击 [确定] 后,如何在 .aspx 页面之间传递变量
【发布时间】:2011-09-23 05:02:52
【问题描述】:

我是网络表单的新手。

1) 我的默认 Web 表单是 Default.aspx。它有几个组合框和一个 Button 控件:所有 ASP.Net Web 控件。

2) 在Page_load()中,我创建了一个C#对象“ScoringInfo()”:

protected void Page_Load(object sender, EventArgs e) { 评分信息 = 新评分信息(); ...

3) ScoringInfo 从数据库中读取一些信息到成员变量中,并使用成员变量填充组合框:

scoreInfo.GetOpenCrossByDate(dt, openCrossInfo); cbAvailableBowlers.Items.Clear (); foreach(openCrossInfo 中的 OpenCrossInfoRec 记录) 字符串 s = 字符串格式( "车道 {0:00}: {1}", rec.laneNo,rec.dateTime); cbAvailableBowlers.Items.Add(s); ...

4) 这里是成员变量:

... 受保护的评分信息评分信息; 受保护的列表 LeagueInfo = new List(); protected List openCrossInfo = new List();

5) 当用户按下按钮时,我想显示第二个 .aspx 页面,该页面处理用户选择的特定组合框项目。这是我的“OnClick”事件处理程序:

protected void bTest_Click1(对象发送者,EventArgs e) { int idx = cbAvailableBowlers.SelectedIndex; 会话["openCrossLaneUniqueId"] = openCrossInfo[idx].laneUniqueId; ...// 失败: // “参数超出范围”异常; // "idx" 为 0; openCrossInfo[] 列表为空...

它不起作用...因为执行 bTest_Click1 时成员变量“openCrossInfo[]”和组合框属性 SelectedIndex 似乎不再有效!

如何/在哪里保存同一会话中其他后续页面的 UI 状态?

【问题讨论】:

    标签: c# webforms session-state


    【解决方案1】:

    页面的成员变量(例如 openCrossInfo)不会在请求之间持续存在。每次有新请求进入时,都会再次创建 .aspx 的 Page 对象。因此,当 bTest_Click 事件触发时,它正在使用 Page 对象的新副本。您的 openCrossInfo 数组没有值,因为页面对象刚刚创建,即使您在之前的请求中设置了它。

    如果你想要保存状态,你将不得不使用其他东西,比如会话状态。

    【讨论】:

      【解决方案2】:

      正如 Jay Douglass 所指出的,问题在于原始页面中的成员变量“openCrossInfo”没有持久化到新的“回发”页面。

      解决办法是:

      1. 创建并初始化原始页面中的对象(“if !IsPostBack”),将初始化的对象保存到Session中,然后
      2. 从后续页面的 Session 中恢复它们:


      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"];
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-02
        • 1970-01-01
        • 1970-01-01
        • 2015-06-02
        • 1970-01-01
        • 2016-12-03
        • 2015-02-21
        相关资源
        最近更新 更多