ASP.NET页面刷新后保留Where子句失效问题排查求助
页面刷新后Where子句丢失问题排查
问题概述
此前实现了页面刷新/数据更新后保留SQL Where子句,使GridView基于该子句显示搜索结果,但当前功能失效,页面刷新后子句被重置。
现有代码
前端ASP.NET代码
<asp:ScriptManager ID="scripttb" runat="server"></asp:ScriptManager> <asp:UpdatePanel ID="paneltb" runat="server"> <ContentTemplate> <asp:Label ID="lbl_whereClause" runat="server" Visible="True"></asp:Label> </ContentTemplate> </asp:UpdatePanel>
C#代码
public class SearchInput { public string id { get; set; } public string email { get; set; } public string department { get; set; } } private SearchInput GetSearchInput() { return new SearchInput() { id = txt_id.Text, email = txt_email.Text, stdepartment = ddl_department.SelectedItem.Text, // 字段名错误 }; } private string stWhereClause() { SearchInput searchInput = GetSearchInput(); string stwhereClause = " WHERE 1=1 "; if (!string.IsNullOrEmpty(searchInput.idmnv)) // 属性名错误 stwhereClause += string.Format("AND ID LIKE '%{0}%' ", searchInput.id); if (!string.IsNullOrEmpty(searchInput.email)) stwhereClause += string.Format("AND Email LIKE '%{0}%' ", searchInput.email); if (!string.IsNullOrEmpty(searchInput.department)) stwhereClause += string.Format("AND CONTAINS ([Department], '" + '"' + searchInput.department + '"' + "')"); return stwhereClause; } // 搜索时赋值 lbl_stwhereClause.Text = stWhereClause(); // 控件ID不匹配
问题排查及修复方案
1. 控件ID不匹配
前端Label的ID是lbl_whereClause,但赋值代码中使用的是lbl_stwhereClause,导致Where子句根本没有存入目标Label。
修复:将赋值代码改为:
lbl_whereClause.Text = stWhereClause();
2. SearchInput属性赋值错误
GetSearchInput方法中给stdepartment赋值,但SearchInput类中对应的属性是department,导致部门搜索条件无法正确获取。
修复:修正赋值字段名:
private SearchInput GetSearchInput() { return new SearchInput() { id = txt_id.Text, email = txt_email.Text, department = ddl_department.SelectedItem.Text, }; }
3. Where子句生成逻辑错误
stWhereClause方法中判断searchInput.idmnv是否为空,但SearchInput类中没有该属性,应该使用searchInput.id,导致ID搜索条件永远不会被添加。
修复:修正判断条件:
if (!string.IsNullOrEmpty(searchInput.id)) stwhereClause += string.Format("AND ID LIKE '%{0}%' ", searchInput.id);
4. 子句持久化机制缺失
仅通过Label控件存储Where子句,ASP.NET页面回发(包括UpdatePanel部分回发)时,若未手动恢复控件值,Label的Text会被重置。Label的ViewState虽默认保存状态,但整页刷新或ViewState禁用时会失效。
修复:将Where子句存入Session持久化,在页面回发时恢复:
// 搜索时保存子句到Session string whereClause = stWhereClause(); lbl_whereClause.Text = whereClause; Session["GridViewWhereClause"] = whereClause; // 在Page_Load中恢复子句 protected void Page_Load(object sender, EventArgs e) { if (IsPostBack && Session["GridViewWhereClause"] != null) { lbl_whereClause.Text = Session["GridViewWhereClause"].ToString(); } }
5. 潜在SQL注入风险
当前直接拼接SQL字符串存在严重注入风险,建议改用参数化查询:
private string stWhereClause(out List<SqlParameter> parameters) { parameters = new List<SqlParameter>(); SearchInput searchInput = GetSearchInput(); string stwhereClause = " WHERE 1=1 "; if (!string.IsNullOrEmpty(searchInput.id)) { stwhereClause += "AND ID LIKE @ID "; parameters.Add(new SqlParameter("@ID", "%" + searchInput.id + "%")); } if (!string.IsNullOrEmpty(searchInput.email)) { stwhereClause += "AND Email LIKE @Email "; parameters.Add(new SqlParameter("@Email", "%" + searchInput.email + "%")); } if (!string.IsNullOrEmpty(searchInput.department)) { stwhereClause += "AND CONTAINS ([Department], @Department)"; parameters.Add(new SqlParameter("@Department", "\"" + searchInput.department + "\"")); } return stwhereClause; }
内容的提问来源于stack exchange,提问作者Alan
相关产品推荐
相关产品推荐

