ASP.NET跨页面传输TextBox数据出现NullReferenceException异常问题求解
ASP.NET跨页面传值空引用错误修复方案
错误根源
- 数据库操作顺序错误:你在未打开数据库连接的状态下直接执行
cmd.ExecuteNonQuery()插入数据,代码直接触发异常跳转到catch块,Session赋值的逻辑完全没有执行,第二页读取到的Session全部为null,调用ToString()时触发空引用异常。 - 缺少空值校验:跨页面传值的场景下未对Session做非空判断就直接调用方法,只要任意一个Session键不存在就会报错。
修复步骤
1. 修正第一页的数据库操作逻辑
将数据库连接打开的操作放到执行SQL之前,同时将Session赋值逻辑放到插入成功的判断分支中,避免插入失败时存储无效值:
SqlConnection conn = new SqlConnection("Data Source=LARI-LUCAS;Initial Catalog = Licenta_BD; Integrated Security = True"); SqlCommand cmd; try { // 先打开连接再执行SQL conn.Open(); cmd = new SqlCommand("insert into Date_studenti_UPT (universitate,facultate,sectie,nume,prenume,gen,an,media,marca,numar) values(@universitate,@facultate,@sectie,@nume,@prenume,@gen,@an,@media,@marca,@numar) ", conn); cmd.Parameters.AddWithValue("@universitate", txtUniv.Text); cmd.Parameters.AddWithValue("@facultate", txtFac.Text.Trim()); cmd.Parameters.AddWithValue("@sectie", txtSectie.Text.Trim()); cmd.Parameters.AddWithValue("@nume", txtNume.Text.Trim()); cmd.Parameters.AddWithValue("@prenume", txtPrenume.Text.Trim()); cmd.Parameters.AddWithValue("@gen", txtGen.Text.Trim()); cmd.Parameters.AddWithValue("@an", txtAn.Text.Trim()); cmd.Parameters.AddWithValue("@media", txtMedie.Text.Trim()); cmd.Parameters.AddWithValue("@marca", txtMarca.Text.Trim()); cmd.Parameters.AddWithValue("@numar", txtNr.Text.Trim()); int rowsAffected = cmd.ExecuteNonQuery(); if (rowsAffected == 1) { // 插入成功后再赋值Session并跳转 Session["Nume"] = txtNume.Text; Session["Prenume"] = txtPrenume.Text; Session["Gen"] = txtGen.Text; Session["An"] = txtAn.Text; Session["Media"] = txtMedie.Text; Session["Universitate"] = txtUniv.Text; Response.Redirect("Profil.aspx"); } else { Label12.Text = "Eroare actualizare date utilizator!"; } } catch (Exception ex) { Label12.Text = "Eroare la deschidere baza date " + ex.Message; } finally { conn.Close(); }
2. 修正第二页的Session读取逻辑
使用安全类型转换+空值合并运算符处理空值场景,避免空引用异常:
protected void Page_Load(object sender, EventArgs e) { // as string转换失败会返回null,配合??运算符为空时赋值空字符串 txtA.Text = Session["An"] as string ?? string.Empty; txtG.Text = Session["Gen"] as string ?? string.Empty; txtM.Text = Session["Media"] as string ?? string.Empty; txtN.Text = Session["Nume"] as string ?? string.Empty; txtP.Text = Session["Prenume"] as string ?? string.Empty; txtUn.Text = Session["Universitate"] as string ?? string.Empty; }
额外排查项
如果修改后仍然无法读取Session,确认web.config配置文件的system.web节点下已开启Session功能(默认已开启,被手动修改的情况才需要检查):
<sessionState mode="InProc" cookieless="false" timeout="20" />
内容的提问来源于stack exchange,提问作者Lari Ana-Maria
相关产品推荐
相关产品推荐

