VB.NET获取数据库ID拼接邮件审批链接出现id=0异常排查
问题现象
- 业务逻辑:用户点击提交按钮后,系统向数据库插入业务数据,同时向对应联系人发送审批通知邮件
- 故障表现:邮件正文内的审批页面链接点击后提示「站点无法访问」,链接携带的参数固定为
id=0,系统其余功能运行正常,仅链接生成逻辑存在异常
根因分析
- ID参数未正确获取:
SendMessage()方法中声明Dim intID As Integer后,整型变量默认初始值为0,代码没有将本次插入数据库生成的新记录主键ID赋值给该变量;且拼接链接时错误调用了LoadEmployeeDetailsById()方法取ID,该方法内部声明的result变量从未被赋值,永远返回空字符串,完全不具备返回记录ID的能力。 - 链接地址格式错误:href拼接时写为
"http://localhost:" & "/test/test.aspx?id=",localhost后仅跟了冒号没有填写实际端口号,生成的链接为格式非法的http://localhost:/test/test.aspx?id=;且localhost是本机回环地址,仅在运行系统的服务器本地可以访问,其他收件人点击该地址会访问自己电脑的本地服务,根本无法连通业务系统。 - 方法职责混乱:
LoadEmployeeDetailsById()本身是根据ID查询详情的方法,内部却加入了UI控件显隐操作(设置pnlApproval.Visible = True),放在发邮件的调用链路中完全不符合逻辑。 - 插入数据方法返回值不合理:
InsertData()方法仅返回1表示插入成功,没有返回新插入记录的自增主键ID,导致发邮件时拿不到正确的审批单ID。
修复方案
- 改造
InsertData方法,插入数据成功后返回本次生成的新记录主键ID,插入失败返回0或负数值作为判断依据,不要仅返回固定值1。 - 改造
SendMessage方法,增加参数接收新记录ID,修正链接拼接逻辑,移除错误的方法调用:Private Sub SendMessage(ByVal newApprovalId As Integer) Dim mail As MailMessage = New MailMessage mail.From = New MailAddress("notice@example.com") mail.To.Add(New MailAddress("user1@example.com")) mail.Subject = "Test Approval" ' 链接拼接注意:正式环境替换为用户可正常访问的系统域名/IP,本地调试需补全项目实际启动端口 Dim targetPath = $"http://你的系统实际访问地址/test/test.aspx?id={newApprovalId}" Dim link As String = $"<a href=""{targetPath}"">点击跳转审批页面</a>" mail.Body = $"<br/><br/>员工工号:{lblEmpNO.Text.Trim(Environment.NewLine, "<br />")}<br/><br/>员工姓名:{lblemployeename.Text.Trim}{link}" mail.IsBodyHtml = True Dim client As New SmtpClient() client.EnableSsl = True Try client.Send(mail) Catch ex As Exception ' 建议新增日志逻辑记录发信失败原因,不要空吞异常 End Try End Sub - 调整
LoadEmployeeDetailsById方法职责,仅保留数据查询逻辑,将pnlApproval.Visible = True这类UI控制逻辑移到页面加载的对应流程中,不要在数据查询/发邮件逻辑里操作页面控件。 - 修改提交按钮点击事件,拿到插入成功返回的新记录ID后,再传入发邮件方法:
Protected Sub btnSubmit_Click(sender As Object, e As EventArgs) Handles btnSubmit.Click ' 接收InsertData返回的新记录ID Dim newRecordId As Integer = InsertData(lblhdddnuserid.Text, lblhddnEmployeedeptid.Text) If newRecordId > 0 Then DisplayMessage("success", "Done", "数据插入成功!") ' 传入正确的审批单ID发邮件 SendMessage(newRecordId) LoadEmployeeByuserid(Membership.GetUser.ProviderUserKey) End If End Sub
本地调试时如果需要用localhost测试,要补全本地项目的实际运行端口,比如项目跑在5219端口,链接就写为
http://localhost:5219/test/test.aspx?id=xxx,正式上线前必须替换为所有用户都能访问的服务地址。
内容的提问来源于stack exchange,提问作者Una O Lian
相关产品推荐
相关产品推荐

