请考虑以下代码:
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);
}
}
在此代码中,当我将'username'声明为private时,在后续回发后将其初始化为null。
为什么?
秘密是什么?
答案 0 :(得分:16)
因为ASP.NET是无状态的,这意味着它不会保持从发布回发回到回发状态。将用户保存到viewstate,session或application,以便在回发时查看回发。
#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
答案 1 :(得分:6)
每次进行任何回发时,即使是按钮点击事件等“简单”事项,您也会使用页面类的新实例。这是ASP.Net 101。
答案 2 :(得分:1)
将用户名字段声明为私有或受保护与此情况无关。唯一的受保护/私有轴承是变量在类外或继承成员中的可访问性。
我认为这可能是一个生命周期问题。
首次导航到此页面时,如果为请求设置了查询字符串,则用户名将只有一个值。因此,“/ TeacherControlPanel.aspx”将具有没有值的用户名,但是“/TeacherControlPanel.aspx?username=SomeUserName”。在这些情况下,字段用户名仅在设置值时才具有值。如果没有设置查询字符串,那么当页面处理按钮单击事件时,加载将触发,没有查询字符串设置意味着用户名将为空,这意味着单击事件将没有任何内容附加到重定向字符串。 / p>
所以问题是,在你的应用程序中,你使用什么导航路径来访问TeacherControlPanel.aspx?