如下面的代碼:
以下是引用片段: <% If isempty(Session("node")) Then Set Session("node")=New ListNode Set n=Session("node") Response.Write n.Content %> |
If isempty(Session("node")) Then Set Session("node")=New ListNode
Set n=Session("node")
Response.Write n.Content
%>
還是上面的ListNode這個類,這段代碼意圖在一個用戶會話中只保留一個ListNode的對 象。所以在用戶第一次訪問該網頁時,會生成ListNode的一個對象,并保存在Session("node")中;后面訪問該網頁時,因為 Session("node")不為空了,所以不會生成一個新的對象,而是到 Session("node")中取出保存的對象。
理論上應該也會輸出100,但是問題來了,ASP一直會報錯:
Microsoft VBScript runtime error '800a01b6'
Object doesn't support this property or method: 'n.Content'
用n.Type也會出錯。同樣的代碼翻譯成PHP,運行卻是可以通過的。為什么?
個人分析下來,認為Session可以保存對象是沒錯,只是VBScript中類型轉換的機制太 弱,而且沒有顯式的強制類型轉換供用戶使用,無法將 Session("node")正確轉換為ListNode類型。因為是自定義的類,我們只能在每個頁面中都出現類的定義語句,這樣在ASP看來,每次讀 取這個頁面時,ListNode類都是一個新類,所以就不認得Session中的這個類的對象了。
結論:盡量不要想到用Session或Application來存儲ASP中自定義類的對象。如果 確實需要,可以考慮用COM來編寫類,然后在VBScript中用:Set Session("obj") = Server.CreateObject("YourApp.YourClass")來創建一個對象,然后即可實現上面預想的功能了。