C#通过Session传递GridView选中用户ID至编辑页的问题修正
解决GridView选中用户ID传递到编辑页的Session错误问题
嘿,咱们先把问题捋清楚:你现在点击GridView里的编辑按钮后,Session存错了内容,导致UserEdit.aspx里的SQL查询直接报语法错误——根源就是你把带URL参数的整串字符串存进了Session,而不是单纯的用户ID。
错误原因拆解
你在BtnEdit_Command里写的是:
Session["userid"] = String.Format("PMUserList?user_id={0}", e.CommandArgument);
这意味着Session里存的是类似PMUserList?user_id=15001的字符串,到了UserEdit页面拼接SQL时,就变成了:
SELECT ... WHERE user_id = PMUserList?user_id=15001;
MySQL肯定看不懂这种语法,自然就报错了。
修正步骤
第一步:修改PMUserList.aspx.cs的Session存储逻辑
把Session里的内容改成纯用户ID,不要带任何URL参数。这里给你两种常用的传递方式:
方式1:用Session传递(保留你的原有思路)
protected void BtnEdit_Command(object sender, CommandEventArgs e) { // 直接存储用户ID字符串,不需要拼接URL Session["userid"] = e.CommandArgument.ToString(); Response.Redirect("UserEdit.aspx"); }
方式2:用URL参数传递(更灵活,不依赖Session)
如果不想用Session,直接把用户ID附在跳转URL后面也是个好选择:
protected void BtnEdit_Command(object sender, CommandEventArgs e) { string userId = e.CommandArgument.ToString(); // 把用户ID作为URL参数传递到编辑页 Response.Redirect($"UserEdit.aspx?user_id={userId}"); }
第二步:修改UserEdit.aspx.cs的取值和SQL查询逻辑
根据你选的传递方式,对应修改LoadData方法,重点:一定要用参数化查询,避免SQL注入!
如果用方式1(Session传递):
private void LoadData() { // 先判断Session是否存在,防止空引用错误 if (Session["userid"] == null) { // 跳回列表页或者提示用户错误 Response.Redirect("PMUserList.aspx"); return; } string userid = Session["userid"].ToString(); // 用参数化查询,避免语法错误和SQL注入 string query = "SELECT user_id, name, contact_no, email, role FROM mydb.User WHERE user_id = @user_id;"; // 示例MySQL参数化查询写法(记得替换成你的连接字符串) using (MySqlConnection conn = new MySqlConnection("你的数据库连接字符串")) { conn.Open(); using (MySqlCommand cmd = new MySqlCommand(query, conn)) { // 添加参数,自动处理字符串引号,避免语法问题 cmd.Parameters.AddWithValue("@user_id", userid); // 这里执行查询并绑定数据到控件即可 } } }
如果用方式2(URL参数传递):
private void LoadData() { // 从URL参数中获取user_id string userid = Request.QueryString["user_id"]; // 判断参数是否为空,防止非法访问 if (string.IsNullOrEmpty(userid)) { Response.Redirect("PMUserList.aspx"); return; } // 同样使用参数化查询 string query = "SELECT user_id, name, contact_no, email, role FROM mydb.User WHERE user_id = @user_id;"; using (MySqlConnection conn = new MySqlConnection("你的数据库连接字符串")) { conn.Open(); using (MySqlCommand cmd = new MySqlCommand(query, conn)) { cmd.Parameters.AddWithValue("@user_id", userid); // 执行查询并绑定数据 } } }
重要提醒:拒绝字符串拼接SQL
你之前直接拼接字符串的写法,不仅会导致语法错误,还存在致命的SQL注入风险——恶意用户可以构造特殊的用户ID来删除你的表或者窃取数据。用参数化查询可以同时解决这两个问题,一定要养成这个习惯!
内容的提问来源于stack exchange,提问作者NRZDYZXLUTMD
相关产品推荐
相关产品推荐

