2011-03-18 53 views
1

改變網頁時,我有一個母版頁設置UPS的一些變量,我想在整個網站使用..爲什麼我會得到「對象引用未設置爲對象的實例」。在asp.net

protected void Page_Load(object sender, EventArgs e) 
{ 
    //Get users name from AD 
    str_DomainName = HttpContext.Current.User.Identity.Name; 
    str_CurrentLogin = str_DomainName.Substring(5); 

    //Display current user information 
    DirectorySearcher search = new DirectorySearcher("LDAP://DCHS"); 
    search.Filter = String.Format("(SAMAccountName={0})", str_CurrentLogin); 
    SearchResult result = search.FindOne(); 
    DirectoryEntry entry = result.GetDirectoryEntry(); 
    lbl_CurrentUser.Text = result.Properties["givenName"][0].ToString() + ' ' + result.Properties["sn"][0].ToString(); 

    // Get SID 
    IntPtr logonToken = WindowsIdentity.GetCurrent().Token; 
    WindowsIdentity windowsId = new WindowsIdentity(logonToken); 

    //Set session variabls 
    this.CurrentFirstName = result.Properties["givenName"][0].ToString(); 
    //this.CurrentEmail = result.Properties["mail"][0].ToString(); 
    //this.CurrentSID = windowsId.User.ToString(); 
    //this.CurrentUserName = str_CurrentLogin; 
    //this.CurrentFullName = lbl_CurrentUser.Text; 
    //this.CurrentDomain = str_DomainName; 
    this.Session.Add("currentEmail", result.Properties["mail"][0].ToString()); 
} 

public String CurrentFirstName 
     { 
      get { return (String)ViewState["currentFirstName"]; } 
      set { ViewState["currentFirstName"] = value; } 
     } 

然後我打電話給他們在我的defalut.aspx頁面如下:

protected void Page_PreRender(object sender, EventArgs e) 
     { 
      //try 
      //{ 
       lbl_FullName.Text = Master.CurrentFullName; 
       lbl_SID.Text = Master.CurrentSID; 
       testLabel.Text = Master.CurrentEmail; 
      //} 
      //catch (Exception ex) 
      //{ } 
     } 

這工作得很好。如果我然而從默認的頁面導航離去,然後我得到下面的錯誤..

Object reference not set to an instance of an object.

其中lbl_FullName.Text = Master.CurrentFullName;

如果我取消了嘗試捕捉然後正常工作,但我不認爲這是避免故障的正確的方法..

我只是新ASP,所以是很好..

編輯:

變量被設置在Master.cs如下。

public String CurrentUserName 
     { 
      get { return (String)ViewState["currentUserName"]; } 
      set { ViewState["currentUserName"] = value; } 
     } 
+0

它可能取決於處理各種事件的順序(也就是說,您可能試圖在頁面設置在母版頁中之前從頁面讀取值)。看看[this](http://msdn.microsoft.com/en-us/library/dct97kc3.aspx)並嘗試檢查事件序列 – 2011-03-18 00:50:19

+0

什麼是Master變量?它會在其他頁面上設置還是僅在默認情況下設置? – Spikolynn 2011-03-18 00:52:33

+0

請參閱我的編輯,瞭解我如何生成變量 – Matt 2011-03-18 01:22:22

回答

0

ViewState是per-頁。當您導航到新頁面時,它未設置。

您的母版頁應該將這些內容替換爲Session

+0

但是當我試圖離開它時,錯誤發生在默認頁面上? – Matt 2011-03-18 02:45:41

+0

@Matt:那麼,你的意思是?你確定錯誤是在默認頁面上嗎?你是如何試圖擺脫它的?無論如何,這並不重要:ViewState是頁面實例的一個屬性。你應該使用'Session'狀態。 – 2011-03-18 02:52:36

+0

我有一個母版頁,它的負載,設置ViewState變量.. Default.aspx是第一個頁面顯示,PreRender方法抓取變量並顯示它們..這一切工作正常..如果我有一個鏈接導航到另一個頁面,例如bob.aspx,然後當我點擊鏈接時,出現錯誤,該錯誤位於Default.aspx頁面的第23行。第23行是 lbl_FullName.Text = Master。 CurrentFullName; – Matt 2011-03-18 03:06:27

1

幾個問題:

  • 哪側的表達式的生成錯誤:this.lbl_FullName或this.Master?
  • 如果是前者,那麼在你的page.aspx.designer.cs文件中會出現一些奇怪的現象。確保標籤控件已經在那裏聲明(這個文件是由visual studio自動生成的,但有時可能無法正確更新)。你應該看到一行是這樣的:

protected global::System.Web.UI.WebControls.Label lbl_FullName;

  • 如果它是this.Master屬性,則您的網頁顯然不是引用您的母版。檢查頁面指令(.aspx文件的頂行)並確保已設置值,並且路徑是正確的。

在設計說明,母版是不是最好的地方,「存儲變量」。主頁應該只是用來在網站上初始化頁面的公共部分。

如果您需要從用戶收集信息並在多個頁面上使用它,請使用會話變量。只要用戶的瀏覽器打開,這是一種將對象「存儲在內存」中的方法。

項目可以添加到會話如下:

this.Session.Add("fullName", fullName); 

項目可以在以後任何其他頁/用戶控件在您的網站上檢索到如下:

string fullName = (string)this.Session["fullName"]; 
+0

如何判斷錯誤來自哪一方?另外,你是否建議我將所有用戶抓取的代碼轉移到默認頁面? – Matt 2011-03-18 01:22:06

+0

另外,你建議我把你提到的代碼放在哪裏?在Default.aspx.cs中? – Matt 2011-03-18 03:09:44

+0

從查看您的代碼,我只是簡單地在主頁面中將「ViewState」替換爲「Session」。 ViewState內存專用於單個頁面(即,當用戶導航到您網站的不同頁面時,它會丟失/清除),而只要您的網站在瀏覽器中打開,會話內存就會持續。另外,如果你將變量存儲在會話中,那麼你只需要將它們存儲並存儲一次 - 如果你使用了ViewState,你必須在每個頁面上再次獲取並存儲它們。 – 2011-03-18 11:08:10

相關問題