在 C# Web 表单中单击 [确定] 后,如何在 .aspx 页面之间传递变量

Posted

技术标签:

【中文标题】在 C# Web 表单中单击 [确定] 后,如何在 .aspx 页面之间传递变量【英文标题】:How do I pass variable between .aspx pages after clicking [OK] in a C# web form 【发布时间】: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 状态?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

解决办法是:

    创建并初始化原始页面中的对象(“if !IsPostBack”),将初始化的对象保存到Session中,然后 从后续页面的 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"];
    

【讨论】:

以上是关于在 C# Web 表单中单击 [确定] 后,如何在 .aspx 页面之间传递变量的主要内容,如果未能解决你的问题,请参考以下文章

如何在 wix 屏幕/对话框之间插入 C# CA 屏幕/表单

单击另一个表单中的按钮提交时如何在c#中重新加载表单?

如何从 C# 中的表单返回值?

如何在layui中使用表单

如何在 Visual Studio 2019 中使用 Xamarin Forms(UWP) 和 C# 创建 Web 应用程序

如何构建多阶段 Web 表单?