ASP.NET如何在网页间保留变量值?随机候选人ID跳转错乱求解
问题核心原因
- 你当前的随机候选人查询逻辑没有判断页面是否为首次加载,每次点击按钮触发回发时都会重新执行SQL,生成新的随机候选人ID,覆盖了原有值
- 普通的页面类字段
IdCandidateRemember不会在回发时自动保留值,ASP.NET页面请求完成后对象会被销毁,回发时会创建新的页面对象实例,字段值会丢失
可行解决方案(无需改动你的SqlDataReader实现逻辑,改动量最小)
方案1:复用现有服务器控件的视图状态(推荐)
步骤1:调整页面加载逻辑,仅首次加载时执行随机查询
将你的查询代码包裹在!IsPostBack判断中,确保回发时不会重新取新的随机候选人:
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { // 注意你原SQL缺少FROM表名、NEWID缺括号,记得补全你的实际表名 string sqlquery = "SELECT TOP 1 IdCandidate FROM 你的候选人表名 ORDER BY NEWID()"; con.Open(); SqlCommand cmd = new SqlCommand(sqlquery, con); SqlDataReader reader = cmd.ExecuteReader(); if (reader.Read()) { string id = reader["IdCandidate"].ToString(); LblIdCandidate.Text = id; } // 用完记得关闭读取器和连接,避免资源泄漏 reader.Close(); con.Close(); } }
步骤2:修改点击事件,直接从Label取值
服务器控件默认开启ViewState,回发时会保留首次加载的Text值,不需要额外定义变量存储:
protected void BtnLearnMore_Click(object sender, EventArgs e) { Response.Redirect("Candidate_Details.aspx?Id=" + LblIdCandidate.Text); }
方案2:用隐藏域存储ID(适合不想在页面显示候选人ID的场景)
如果不需要把候选人ID展示在页面上,可以把可见的Label替换为隐藏域,逻辑完全一致:
前端修改
<table class="table-random-candidate"> <asp:HiddenField ID="HfCandidateId" runat="server" /> <asp:Button ID="BtnLearnMore" runat="server" Text="Learn More" OnClick="BtnLearnMore_Click" /> </table>
后台调整
首次加载时给HfCandidateId.Value赋值,点击事件中读取该属性即可。
额外说明
你之前用Session失败大概率也是因为没有加!IsPostBack判断,每次回发都更新了Session中的值导致出错,本方案用页面级的ViewState存储值,不会出现多标签页串值的问题,更适合当前场景。
内容的提问来源于stack exchange,提问作者carlos
相关产品推荐
相关产品推荐

