ASP.NET用户资料页面无法获取文本框更新值问题
问题:用户编辑Profile页面后保存,获取到的是文本框旧值
我正在开发一个包含UserProfile页面的项目,用户进入页面时系统从数据库获取数据填充文本框,修改后点击保存,但点击保存时获取到的是文本框的旧值。
Profile.aspx(前端页面)
<%@ Page Title="" Language="C#" MasterPageFile="~/Content/MasterPage.master" AutoEventWireup="true" CodeFile="Profile.aspx.cs" Inherits="AdminSide_Profile" %> <asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server"> <link rel="stylesheet" href="../CSS/profilecss.css" /> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-alpha1/dist/js/bootstrap.bundle.min.js"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-alpha1/dist/css/bootstrap.min.css"> </asp:Content> <asp:Content ID="Content2" ContentPlaceHolderID="cphMain" runat="Server"> <div class="container rounded bg-white mt-5 mb-5"> <div class="row"> <div class="col-md-3 border-right"> <div class="d-flex flex-column align-items-center text-center p-3 py-5"> <asp:Label ID="lblUser" runat="server" CssClass="font-weight-bold" EnableViewState="false"></asp:Label> </div> </div> <div class="col-md-5 border-right"> <div class="p-3 py-5"> <div class="d-flex justify-content-between align-items-center mb-3"> <h4 class="text-right">Profile Settings</h4> </div> <div class="row mt-2"> <div class="col-md-12"> <label class="labels">Name</label> <asp:TextBox ID="txtName" runat="server" CssClass="form-control" PlaceControl="Enter User Name"></asp:TextBox> </div> </div> <div class="row mt-3"> <div class="col-md-12"> <label class="labels">Mobile Number</label> <asp:TextBox ID="txtMobileNumber" runat="server" CssClass="form-control" PlaceControl="Enter User Name"></asp:TextBox> </div> <div class="col-md-12"> <label class="labels">Email ID</label> <asp:TextBox ID="txtEmail" runat="server" CssClass="form-control" PlaceControl="Enter User Name"></asp:TextBox> </div> <div class="col-md-12"> <label class="labels">Password</label> <asp:TextBox ID="txtPassword" runat="server" CssClass="form-control" PlaceControl="Enter Password Name"></asp:TextBox> </div> </div> <div class="row"> <div class="col-md-12"> <asp:Label ID="lblMessage" runat="server" EnableViewState="false"></asp:Label> </div> </div> <div class="mt-5 text-center"> <asp:Button ID="btnSave" runat="server" Text="Save" CssClass="btn btn-primary profile-button" OnClick="btnSave_Click" /> </div> </div> </div> </div> </div> </asp:Content>
Profile.aspx.cs(后台逻辑)
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using InterviewPrepration.BAL; using InterviewPrepration.ENT; using InterviewPrepration.DAL; using System.Data.SqlTypes; public partial class AdminSide_Profile : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (Session["UserID"] != null) { UserBAL baluser = new UserBAL(); UserENT entuser = new UserENT(); entuser = baluser.SelectByID(Convert.ToInt32(Session["UserID"].ToString().Trim())); txtName.Text = entuser.User_Name.Value.ToString(); txtMobileNumber.Text = entuser.ContactNo.Value.ToString(); txtEmail.Text = entuser.Email_ID.Value.ToString(); txtPassword.Text = entuser.Password.Value.ToString(); lblUser.EnableViewState = true; lblUser.Text = entuser.User_Name.Value.ToString(); } if (Session["UserID"] == null) { Response.Redirect("~/AdminSide/Login.aspx"); } } protected void btnSave_Click(object sender, EventArgs e) { String err = ""; if (txtName.Text.Trim() == "") { err += "Please Enter Name"; } if (txtEmail.Text.Trim() == "") { err += "Please Enter EmailId"; } if (txtMobileNumber.Text.Trim() == "") { err += "Please Enter Mobile Number"; } if (err != "") { lblMessage.EnableViewState = true; lblMessage.Text = err.ToString(); } UserENT entuser = new UserENT(); if(txtName.Text.Trim() != "") { entuser.User_Name = txtName.Text.Trim(); } if (txtMobileNumber.Text.Trim() != "") { entuser.ContactNo = txtMobileNumber.Text.Trim(); } if (txtEmail.Text.Trim() != "") { entuser.Email_ID = txtEmail.Text.Trim(); } if(txtPassword.Text.Trim() != "") { entuser.Password = txtPassword.Text.Trim(); } if(Session["UserID"] != null) { entuser.User_ID = Convert.ToInt32(Session["UserID"].ToString()); } UserBAL baluser = new UserBAL(); if (baluser.Update(entuser)) { lblMessage.EnableViewState = true; lblMessage.Text = "Updated Sucessfully"; } } }
核心保存逻辑片段
protected void btnSave_Click(object sender, EventArgs e) { UserENT entuser = new UserENT(); if(txtName.Text.Trim() != "") { entuser.User_Name = txtName.Text.Trim(); } if (txtMobileNumber.Text.Trim() != "") { entuser.ContactNo = txtMobileNumber.Text.Trim(); } if (txtEmail.Text.Trim() != "") { entuser.Email_ID = txtEmail.Text.Trim(); } if(txtPassword.Text.Trim() != "") { entuser.Password = txtPassword.Text.Trim(); } if(Session["UserID"] != null) { entuser.User_ID = Convert.ToInt32(Session["UserID"].ToString()); } }
BALUser.cs(业务逻辑层)
#region Update public Boolean Update(UserENT entuser) { UserDAL daluser = new UserDAL(); if (daluser.PR_IP_User_UpdateByUserID(entuser)) { return true; } else { Message = daluser.Message; return false; } }
此为Profile.aspx.cs调用的更新方法
DALUser.cs(数据访问层)
用于执行数据库操作的DAL文件。
#region PR_IP_User_UpdateByUserID public Boolean PR_IP_User_UpdateByUserID(UserENT entuser) { using (SqlConnection objConn = new SqlConnection(ConnectionString)) { objConn.Open(); using (SqlCommand objCmd = objConn.CreateCommand()) { try { #region PrpepredCommand objCmd.CommandType = CommandType.StoredProcedure; objCmd.CommandText = "PR_IP_User_UpdateByUserID"; objCmd.Parameters.AddWithValue("@UserID", entuser.User_ID); objCmd.Parameters.AddWithValue("@UserName", entuser.User_Name); objCmd.Parameters.AddWithValue("@Password", entuser.Password); objCmd.Parameters.AddWithValue("@EmailID", entuser.Email_ID); objCmd.Parameters.AddWithValue("@ContactNo", entuser.ContactNo); //objCmd.Parameters.AddWithValue("@IsAdmin", entuser.Is_Admin); #endregion objCmd.ExecuteNonQuery(); return true; } catch (Exception ex) { Message = ex.InnerException.Message; return false; } } } #endregion
ENTUser.cs(实体类)
用户实体类文件。
namespace InterviewPrepration.ENT { public class UserENT : DataBaseConfig { #region Constructor public UserENT() { } #endregion #region User ID protected SqlInt32 _User_ID; public SqlInt32 User_ID { get { return _User_ID; } set { _User_ID = value; } } #endregion #region User_Name protected SqlString _User_Name; public SqlString User_Name { get { return _User_Name; } set { _User_Name = value; } } #endregion #region Password protected SqlString _Password; public SqlString Password { get { return _Password; } set { _Password = value; } } #endregion #region ContactNo protected SqlString _ContactNo; public SqlString ContactNo { get { return _ContactNo; } set { _ContactNo = value; } } #endregion #region Email_ID protected SqlString _Email_ID; public SqlString Email_ID { get { return _Email_ID; } set { _Email_ID = value; } } #endregion #region IsAdmin protected SqlBoolean _Is_Admin; public SqlBoolean Is_Admin { get { return _Is_Admin; } set { _Is_Admin = value; } } #endregion } }
问题原因及解决方案
原因
ASP.NET页面生命周期中,Page_Load事件会在每次页面回发(如点击按钮)时触发。当前代码未做判断,每次加载都从数据库重新获取数据覆盖文本框,导致保存时控件值已被重置为旧数据,而非用户修改后的新值。
解决方案
修改Page_Load方法,仅在页面首次加载(非回发)时填充文本框数据,通过IsPostBack属性判断:
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) // 仅首次加载时填充数据 { if (Session["UserID"] != null) { UserBAL baluser = new UserBAL(); UserENT entuser = new UserENT(); entuser = baluser.SelectByID(Convert.ToInt32(Session["UserID"].ToString().Trim())); txtName.Text = entuser.User_Name.Value.ToString(); txtMobileNumber.Text = entuser.ContactNo.Value.ToString(); txtEmail.Text = entuser.Email_ID.Value.ToString(); txtPassword.Text = entuser.Password.Value.ToString(); lblUser.EnableViewState = true; lblUser.Text = entuser.User_Name.Value.ToString(); } } if (Session["UserID"] == null) { Response.Redirect("~/AdminSide/Login.aspx"); } }
额外优化建议
- 保存成功后可重新加载用户数据,刷新页面显示最新信息;
- 密码字段添加
TextMode="Password"属性,避免明文显示; - 错误提示添加换行或分隔符,提升可读性;
- 修正实体类中重复的区域注释,保持字段与注释对应。
内容的提问来源于stack exchange,提问作者Vandit Joshi
相关产品推荐
相关产品推荐

