在 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 屏幕/表单
如何在 Visual Studio 2019 中使用 Xamarin Forms(UWP) 和 C# 创建 Web 应用程序