2011-10-12 38 views
0

在我的VB.net站點中使用會話變量已經算得很好。我只需要讓我的歡迎消息留在每一頁上。我把代碼和文本框放在我的母版頁中,以允許郵件停留在那裏,但是當我點擊不同的頁面時,帶有用戶名的標籤就消失了。使用會話在每個頁面上顯示的歡迎消息

會話仍然存在,因爲如果會話由於某種原因被銷燬或不可用,我將它設置爲顯示輸入代碼的文本框。

有人能告訴我哪部分代碼不允許用戶會話的First_Name和Last_Name顯示出來嗎?問題出在Page_Load上,但我想我會拋出整個master.vb文件來顯示我目前爲止的所有內容。

Partial Class MasterPage 
Inherits System.Web.UI.MasterPage 
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    Dim FirstName As String = String.Empty 
    Dim LastName As String = String.Empty 

    If Session("IB") Is Nothing Then 
     IBText.Visible = "True" 
     IBTextBox.Visible = "True" 
     IBTextBoxButton.Visible = "True" 
    Else 
     Session("First_Name") = FirstName 
     Session("Last_Name") = LastName 
     IBText.Visible = "False" 
     IBTextBox.Visible = "False" 
     IBTextBoxButton.Visible = "False" 
     lblIB.Visible = "True" 
     lblIB.Text = "Welcome, " + Session("First_Name") + " " 
     + Session("Last_Name") + "." 
    End If 
End Sub 


Protected Sub IBTextBoxButton_Click(ByVal sender As Object, ByVal e As 
System.EventArgs) Handles IBTextBoxButton.Click 
    Session("IB") = IBTextBox.Text 
    Dim IB As String = Session("IB") 
    'Response.Redirect(Request.RawUrl + "&IB=" + Session("IB")) 
End Sub 
Protected Sub CustomValidator1_ServerValidate(ByVal source As Object, ByVal args As 
System.Web.UI.WebControls.ServerValidateEventArgs) Handles 
CustomValidator1.ServerValidate 

    Dim FirstName As String = String.Empty 
    Dim LastName As String = String.Empty 

    If GetAccountName(args.Value, FirstName, LastName) Then 
     Session("First_Name") = FirstName 
     Session("Last_Name") = LastName 

     IBText.Visible = "False" 
     IBTextBox.Visible = "False" 
     IBTextBoxButton.Visible = "False" 
     lblIB.Visible = "True" 

     lblIB.Text = "Welcome, " + Session("First_Name") + " " + Session("Last_Name") 
     + "." 
     args.IsValid = True 
    Else 
     args.IsValid = False 
    End If 
End Sub 


Private Function GetAccountName(ByVal baccount As String, ByRef FirstName As String, 
ByRef LastName As String) As Boolean 
    Dim sql As String = "select baccount, First_Name, Last_Name" & _ 
     " from IB inner join IB_BUISNESS_INFORMATION ON 
     (IB.IB_ID = IB_BUISNESS_INFORMATION.IB_ID)" & _ 
     " where baccount = @baccount" 
    Using conn As New 
    SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings 
    ("IBConnectionString").ConnectionString) 
     Using cmd As New SqlCommand(sql, conn) 
      cmd.Parameters.AddWithValue("@baccount", baccount) 
      conn.Open() 
      Using rdr As SqlDataReader = cmd.ExecuteReader 
       If (rdr.Read) Then 
        FirstName = rdr("First_Name").ToString() 
        LastName = rdr("Last_Name").ToString() 
        Return True 
       Else 
        Return False 
       End If 
      End Using 
     End Using 
    End Using 
End Function 
End Class 

回答

1

如果你的會話價值沒有,你與String.Empty覆蓋它:

Dim FirstName As String = String.Empty 
Dim LastName As String = String.Empty 
'..... ' 
Session("First_Name") = FirstName 
Session("Last_Name") = LastName 

刪除最後兩行,也是變數FirstNameLastName,因爲它們是不必要的反正。

此外,Visible是一個布爾屬性,而不是類型的String

IBText.Visible = "False" 

應該

IBText.Visible = False 

我會建議設置Option Strict On,因爲它是不容易出錯。

你可能會得到很多例外。但通過更正您的代碼,您會看到什麼強類型意味着多少編譯器尚未解釋您的代碼(可能不正確,但可能很慢)。爲什麼不直接告訴他你想要什麼?! Microsoft幫助VB6程序員遷移到.NET的方式是Option Strict Off,但應該避免。順便說一句,你的代碼永遠不會用C#編譯。

以下是有關這個話題+ Option Explicit一些其他的想法:http://www.codinghorror.com/blog/2005/08/option-strict-and-option-explicit-in-vbnet-2005.html

+0

+1同樣想法... – gbianchi

+0

由於它的工作! 「False」和False有什麼區別?他們在我的頁面上似乎都以相同的方式工作。 – jlg

+0

@jlg:編輯我的答案。編譯器只是試圖將你的字符串解析爲一個布爾變量。但最好直接告訴他你正在分配一個布爾值。這樣你就可以在編譯時產生異常,而不是在運行時(甚至在生產中)。 –