You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:48:56