2009-08-21 9 views
8

值考慮下面的代碼:ASP.NET私有成員字段失去對回發

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

在這段代碼,當我宣佈「用戶名」爲私有,則隨後的後背上後初始化爲空。

爲什麼?

祕密是什麼?

+1

你是說代碼是按照書面形式工作的,但是當你把用戶名改成私有變量時,它會失敗? – 2009-08-21 19:09:23

+0

它初始化爲null還是string.Empty? – Martin 2009-08-21 19:10:33

+0

@Martin,它是空的。 – anonymous 2009-08-21 19:14:26

回答

15

因爲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 
+0

但他在做每個頁面加載時的'username =(string)Request.QueryString [「username」];''。 – Kobi 2009-08-21 19:13:22

+0

@David Basarab,我沒有要求解決方案。我想知道btwn的效果差異。在這種情況下保護vs私人。 – anonymous 2009-08-21 19:19:56

5

你做任何回傳,甚至像按鈕點擊事件「簡單」的事情每一次,你與網頁類的新實例工作。這就是ASP.Net 101.

+0

如果您重定向到新頁面或使用新的查詢字符串加載頁面,那不是回發。如果使用查詢字符串處理頁面上的按鈕單擊事件,那是回發,並且查詢字符串與回發http請求一起發送。無論哪種方式,它仍然是頁面類的新實例。 – 2009-08-21 19:13:19

+0

我沒有找到我的答案與保護與私人相關。 – anonymous 2009-08-21 19:18:06

1

將用戶名字段聲明爲私有或受保護對此情況沒有影響。唯一受保護/私有的軸承是變量在類之外或繼承成員中的可訪問性。

我相信這可能是一個生命週期問題。

當您第一次導航到此頁面時,如果爲請求設置了查詢字符串,用戶名將只有一個值。所以,「/TeacherControlPanel.aspx」將有一個沒有值的用戶名,但是「/TeacherControlPanel.aspx?username=SomeUserName」。在這些情況下,只有設置了字段用戶名纔會有值。如果沒有設置查詢字符串,那麼當頁面處理按鈕點擊事件時,負載將會觸發,沒有查詢字符串集意味着用戶名將爲空,這意味着點擊事件將沒有任何附加到重定向字符串。

所以問題是,在您的應用程序中,您使用什麼導航路徑到達TeacherControlPanel.aspx?

+2

此外,受保護的字段將在頁面上顯示(TeacherControlPanel.aspx,<% %>語句),而私有字段不是。 – Kobi 2009-08-21 22:53:50