Поле закрытого члена ASP.NET теряет значение при обратной передаче - PullRequest
8 голосов
/ 21 августа 2009

Рассмотрим следующий код:

    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' частным, оно инициализируется нулем после последующих постов.

Почему?

В чем секрет?

Ответы [ 3 ]

16 голосов
/ 21 августа 2009

Поскольку ASP.NET не имеет состояния, то есть он не сохраняет свое состояние от отправки к отправке. Сохраните пользователя в viewstate, сеансе или приложении, чтобы увидеть его при обратной передаче.

#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
6 голосов
/ 21 августа 2009

Каждый раз, когда вы выполняете любую обратную передачу, даже для таких «простых» вещей, как события нажатия кнопки, вы работаете с новым экземпляром класса страницы. Это ASP.Net 101.

1 голос
/ 22 августа 2009

Объявление поля имени пользователя как личного или защищенного не имеет отношения к этой ситуации. Единственный защищенный / приватный объект - это доступность переменной вне класса или унаследованных членов.

Я полагаю, что это проблема жизненного цикла.

Когда вы переходите на эту страницу в первый раз, имя пользователя будет иметь значение только в том случае, если для запроса была задана строка запроса. Таким образом, «/TeacherControlPanel.aspx» будет иметь имя пользователя без значения, но «/TeacherControlPanel.aspx?username=SomeUserName». В этих случаях поле username будет иметь значение, только если оно установлено. И если строка запроса не установлена, то когда страница обрабатывает событие нажатия кнопки, загрузка сработает, не заданная строка запроса означает, что имя пользователя будет нулевым, что означает, что событию click нечего добавить к строке перенаправления.

Таким образом, вопрос в вашем приложении, какой путь навигации вы используете для доступа к TeacherControlPanel.aspx?

...