ASP.NET注册表单求助:验证提示时机设置及SQL语法错误排查
我来帮你搞定这两个问题,咱们逐个分析解决:
问题1:仅在点击按钮后显示验证提示(初始加载不显示)
你当前页面上的验证提示是用静态<span>标签写死的,所以页面一加载就会显示出来。要实现仅在提交且输入有误时才显示提示,需要用ASP.NET自带的验证控件来替代静态文本,同时调整验证控件的显示设置:
具体步骤:
替换静态提示为
RequiredFieldValidator控件:
把每个字段旁的静态<span class="auto-style8">...</span>换成RequiredFieldValidator,这个控件会在用户未输入内容(或未选择有效选项)时,仅在提交后显示错误提示。
比如Title字段的修改:<!-- 原来的静态提示 --> <span class="auto-style8">Enter a title.</span> <!-- 替换为以下验证控件 --> <asp:RequiredFieldValidator ID="ReqTitle" runat="server" ControlToValidate="TxtTitle" ErrorMessage="Enter a title." ForeColor="Red" Display="Dynamic"> </asp:RequiredFieldValidator>对Name、ID、Email、Mobile字段做同样的替换,Major字段需要额外设置
InitialValue,确保用户不能选择默认的"Select Option":<asp:RequiredFieldValidator ID="ReqMajor" runat="server" ControlToValidate="LstMajor" ErrorMessage="Choose major." ForeColor="Red" Display="Dynamic" InitialValue="Select Option"> </asp:RequiredFieldValidator>调整现有正则验证控件的显示方式:
把已有的RegularExpressionValidator的Display属性设为Dynamic,这样初始加载时不会占用空间,仅验证失败时显示;同时修正你的正则表达式语法错误(把\d(9)改成\d{9},表示匹配9位数字,手机号的\d(10)同理改成\d{10}):<asp:RegularExpressionValidator ID="RegularExpressionValidator3" runat="server" ErrorMessage="Invalid ID" ControlToValidate="TxtID" ForeColor="Red" ValidationExpression="\d{9}" Display="Dynamic"> </asp:RegularExpressionValidator>
问题2:SqlException: Incorrect syntax near 'has' 的原因及解决
这个错误的核心原因非常明显:你把成功提示文本当成了SQL语句执行!
错误分析:
后端代码里这行完全错误:
cmd.CommandText = "Your request has been submitted successfully";
ExecuteNonQuery()方法会把这个字符串当成SQL命令发送给数据库,但这根本不是有效的SQL语句,数据库自然会报语法错误。
解决方案:
编写正确的INSERT SQL语句:
你需要把表单数据插入到数据库的对应表中(假设你的表名为Registrations,字段和你的参数对应,记得替换成你实际的表名和字段名):cmd.CommandText = "INSERT INTO Registrations (Title, Name, ID, Email, Mobile, Major, Note) " + "VALUES (@TTitle, @TName, @TID, @TEmail, @TMobile, @LMajor, @TNote)";修复代码中的其他小错误:
- 你的
LstMajor参数行多了多余的分号和括号,要修正:// 原来的错误代码 cmd.Parameters.AddWithValue("@LMajor", LstMajor.SelectedItem.ToString());); // 修正后 cmd.Parameters.AddWithValue("@LMajor", LstMajor.SelectedItem.Text); - 用
using语句管理数据库连接,避免连接泄漏:protected void Button1_Click(object sender, EventArgs e) { // 使用using自动释放连接 using (SqlConnection con = new SqlConnection(@"Data Source=DESKTOP-20J5J59; Integrated Security=True")) { con.Open(); SqlCommand cmd = con.CreateCommand(); cmd.Parameters.AddWithValue("@TTitle", TxtTitle.Text); cmd.Parameters.AddWithValue("@TName", TxtName.Text); cmd.Parameters.AddWithValue("@TID", TxtID.Text); cmd.Parameters.AddWithValue("@TEmail", TxtEmail.Text); cmd.Parameters.AddWithValue("@TMobile", TxtMobile.Text); cmd.Parameters.AddWithValue("@LMajor", LstMajor.SelectedItem.Text); cmd.Parameters.AddWithValue("@TNote", TxtNote.Text); // 正确的INSERT语句 cmd.CommandText = "INSERT INTO Registrations (Title, Name, ID, Email, Mobile, Major, Note) VALUES (@TTitle, @TName, @TID, @TEmail, @TMobile, @LMajor, @TNote)"; cmd.ExecuteNonQuery(); // 插入成功后显示提示 Response.Write("<script>alert('Your request has been submitted successfully');</script>"); } } - 修复按钮的
OnClientClick语法错误(缺少引号),更合理的是去掉这个点击时的提示,改为插入成功后再提示:<asp:Button ID="Button1" runat="server" Text="Register" Font-Size="Medium" Height="36px" Width="110px" OnClick="Button1_Click" />
- 你的
内容的提问来源于stack exchange,提问作者Mariam

