You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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");
    }
}

额外优化建议

  1. 保存成功后可重新加载用户数据,刷新页面显示最新信息;
  2. 密码字段添加TextMode="Password"属性,避免明文显示;
  3. 错误提示添加换行或分隔符,提升可读性;
  4. 修正实体类中重复的区域注释,保持字段与注释对应。

内容的提问来源于stack exchange,提问作者Vandit Joshi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 16:10:36