ASP.NET TextBox值无法传递至后端,点击按钮后控件值为空
解决ASP.NET注册表单控件值为空问题
点击「Create Account」按钮后,后端无法获取到txt_Username.Text等控件的用户输入值,相关代码如下:
前端标记
<p class="text-center" style="font-family: 'Playfair Display', serif; font-size: 1.25rem; font-weight: bold;"> Create an Account </p> <div class="mb-3"> <asp:TextBox ID="txt_Username" CssClass="form-control" PlaceHolder="Username" runat="server"></asp:TextBox> </div> <div class="mb-3"> <asp:TextBox ID="txt_RegEmail" CssClass="form-control" PlaceHolder="Email Address" runat="server"></asp:TextBox> </div> <div class="mb-3"> <asp:TextBox ID="txt_RegPassword" CssClass="form-control" PlaceHolder="Password" runat="server"></asp:TextBox> </div> <div class="mb-3"> <asp:TextBox ID="txt_ConfirmPW" CssClass="form-control" PlaceHolder="Confirm Password" runat="server"></asp:TextBox> </div> <div class="mb-3 text-center text-danger"> <asp:CompareValidator ID="CompareValidatorPW" runat="server" ErrorMessage="Passwords must match!" ControlToValidate="txt_ConfirmPW" ControlToCompare="txt_RegPassword" Operator="Equal" Type="String"> </asp:CompareValidator> </div> <div class="d-grid"> <asp:Button runat="server" ID="btnRegister" Text="Create Account" CssClass="Greengradiant btn- large" OnClick="btnRegister_Click" UseSubmitBehavior="false" /> </div>
后端代码
protected void btnRegister_Click(object sender, EventArgs e) { Debug.WriteLine($"Username: {txt_Username.Text}, Email: {txt_RegEmail.Text}, Password: {txt_RegPassword.Text}, Password2: {txt_ConfirmPW.Text}"); Guid newGUID = Guid.NewGuid(); SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Database1"].ConnectionString); conn.Open(); bool exists = false; using (SqlCommand cmd = new SqlCommand("SELECT COUNT(*) FROM [User] WHERE Email = @email", conn)) { //checks if the email that the user has entered exists in the database table cmd.Parameters.AddWithValue("Email", txt_RegEmail.Text); exists = (int)cmd.ExecuteScalar() > 0; } // if the email exists, send an alert if (exists) { Response.Write("<script>alert('Sorry, Email is already taken!');</script>"); } // else, insert else { string insertQuery = "INSERT INTO [USER] (User_ID, Username, Email, Password, Role, Created_At) " + "values (@id, @username, @email, @password, @role, @timestamp)"; SqlCommand com = new SqlCommand(insertQuery, conn); string ePass = Hash.ComputeHash(txt_RegPassword.Text, "SHA512", null); com.Parameters.AddWithValue("@password", ePass); com.Parameters.AddWithValue("@id", newGUID.ToString()); com.Parameters.AddWithValue("@email", txt_RegEmail.Text); com.Parameters.AddWithValue("@username", txt_Username.Text); com.Parameters.AddWithValue("@role", 0); com.Parameters.AddWithValue("@timestamp", DateTime.Now); com.ExecuteNonQuery(); Response.Write("<script>alert('Successfully created account! Welcome! ');</script>"); } conn.Close(); txt_Username.Text = ""; txt_RegEmail.Text = ""; }
解决步骤
- 确保控件在服务器端表单内:ASP.NET WebForms要求所有
runat="server"的控件必须包裹在<form runat="server">标签中,否则无法回传用户输入值。将上述前端代码全部放入<form runat="server">...</form>内。 - 检查ViewState设置:确认页面指令
<%@ Page ... EnableViewState="true" %>未禁用ViewState,且各TextBox控件的EnableViewState属性未设为false。 - 调整Button的UseSubmitBehavior属性:当前按钮设置了
UseSubmitBehavior="false",会通过客户端脚本触发回传,若存在脚本冲突可能导致值丢失。尝试改为UseSubmitBehavior="true",或排查页面中是否有阻止表单提交的自定义脚本。 - 避免重复控件ID:检查页面中是否存在与
txt_Username、txt_RegEmail等重复的控件ID,重复ID会导致回传值异常。 - 排查Page_Load事件:若
Page_Load事件中有重置TextBox值的代码,需将初始化逻辑放在!IsPostBack判断内,防止覆盖用户输入:protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { // 仅首次加载时执行的初始化代码 } }
内容的提问来源于stack exchange,提问作者gareth lin
相关产品推荐
相关产品推荐

