ASP.NET私有成员字段失去对回传值(ASP.NET private member field l

2019-07-03 11:28发布

考虑下面的代码:

    public partial class TeacherControlPanel : System.Web.UI.Page
    {
        protected string username = string.Empty;

        protected void Page_Load(object sender, EventArgs e)
        {
            username = (string)Request.QueryString["username"];

            Ice_Web_Portal.BO.Teacher teacher = Ice_Web_Portal.BO.Teacher.GetTeacherByUsername(username);

            if (teacher != null)
            {
                labUsername.Text = username;
                labName.Text = teacher.TeacherName;
                labTeacherCode.Text = teacher.TeacherCode;

                Dept dept = teacher.Department;

                if (dept != null)
                {
                    labDepartment.Text = dept.DeptName;
                }
            }
            else
            {
                //labErrorMessage.Text = "No teacher found";
            }
        }

        protected void btnSendMail_Click(object sender, EventArgs e)
        {
            Response.Redirect(@"~/Teacher/TeacherComposeMail.aspx?username=mahabub" + username);            
        }
}

在这段代码,当我宣布“用户名”为私有,则随后的后背上后初始化为空。

为什么?

秘密是什么?

Answer 1:

因为ASP.NET是无状态意味着它不会保持它的状态,从后回到回发。 用户保存到视图状态,会话或应用程序,看看它在回发回发。

#region UserName
public string UserName
{
    get
    {
        if (this.ViewState["UserName"] == null)
            return string.Empty;

        return (string)this.ViewState["UserName"];
    }
    set { this.ViewState["UserName"] = value; }
}
#endregion


Answer 2:

每次你做任何回发,即使是“简单的”喜欢按钮点击事件的事情,你与页面类的新实例的工作。 这ASP.Net 101。



Answer 3:

声明用户名字段为私有或受保护的,对这种情况没有关系。 保护/私人将有唯一的轴承是类外或在继承的成员变量的可访问性。

我相信这可能是一个生命周期的问题。

当您导航到该页面的第一次,如果查询字符串是为要求设置的用户名只能有一个值。 所以,“/TeacherControlPanel.aspx”将没有任何价值,用户名,但“/TeacherControlPanel.aspx?username=SomeUserName”。 在这种情况下,该领域的用户名只打算如果被设置为具有价值。 如果没有查询字符串设置,那么当页面处理按钮点击事件,负载会火,没有查询字符串集合意味着用户名将会是空的,这意味着click事件也就没什么可附加到重定向字符串。

所以现在的问题是,在你的应用程序,什么导航路径是您使用去TeacherControlPanel.aspx?



文章来源: ASP.NET private member field loses value on postback