Это вызывает оценку нескольких операторов, но использует только последний в качестве получающегося значения (rvalue, я думаю).
Так...
int f() { return 7; }
int g() { return 8; }
int x = (printf("assigning x"), f(), g() );
должен привести к x, устанавливаемому на 8.
Разве это не должно быть
If IsObject(Session("somePerson")) = true Then
set mySessionPerson = Session("somePerson")
Я не могу объяснить, почему ваш код не работает. Мне кажется, что это нормально.
Объект создается в контексте скрипта, который впоследствии удаляется после завершения запроса. Следовательно, пока имя типа доступно, функция объекта нарушена.
Я могу сказать вам, что хранить объекты в сеансе, даже те, которые не созданы в скрипте, - не лучшая идея.
Большинство объектов, используемых в ASP, существуют в одном нить. После создания только поток, создавший объект, может получить доступ к объекту. Чтобы справиться с этим после того, как вы сохранили объект в сеансе, ASP связывает сеанс с конкретным рабочим потоком, который создал этот объект.
Когда поступает следующий запрос для этого сеанса, он теперь должен обрабатываться его конкретным рабочим потоком.
Я бы создал COM-объект, похожий на ваш класс Person с VB6. Тогда сохраните это. Код очень похож.
Метод Пита, вероятно, работает.
Вы можете это сделать, но нужно быть немного хитрым. Насколько я понимаю, когда вы храните домашний запеченный объект в Session, он сохраняет все данные, но теряет все функциональные возможности. Чтобы восстановить функциональность, вам нужно «повторно гидратировать» данные из сеанса.
Вот пример в JScript для ASP:
<%@ Language="Javascript" %>
<%
function User( name, age, home_town ) {
// Properties - All of these are saved in the Session
this.name = name || "Unknown";
this.age = age || 0;
this.home_town = home_town || "Huddersfield";
// The session we shall store this object in, setting it here
// means you can only store one User Object per session though
// but it proves the point
this.session_key = "MySessionKey";
// Methods - None of these will be available if you pull it straight out of the session
// Hydrate the data by sucking it back into this instance of the object
this.Load = function() {
var sessionObj = Session( this.session_key );
this.name = sessionObj.name;
this.age = sessionObj.age;
this.home_town = sessionObj.home_town;
}
// Stash the object (well its data) back into session
this.Save = function() {
Session( this.session_key ) = this;
},
this.Render = function() {
%>
<ul>
<li>name: <%= this.name %></li>
<li>age: <%= this.age %></li>
<li>home_town: <%= this.home_town %></li>
</ul>
<%
}
}
var me = new User( "Pete", "32", "Huddersfield" );
me.Save();
me.Render();
// Throw it away, its data now only exists in Session
me = null;
// Prove it, we still have access to the data!
Response.Write( "<h1>" + Session( "MySessionKey" ).name + "</h1>" );
// But not its methods/functions
// Session( "MySessionKey" ).Render(); << Would throw an error!
me = new User();
me.Load(); // Load the last saved state for this user
me.Render();
%>
Это довольно мощный метод управления сохранением состояния в сеансе, который легко может быть заменен для вызовов БД / XML и т. д., если необходимо.
Интересно, что Энтони поднимает о потоках, зная его глубину знаний, я уверен, что это правильно и есть над чем подумать, но если это небольшой сайт, вы сможете обойтись без рук. мы использовали это на сайте среднего размера (10 000 посетителей в день) в течение многих лет без каких-либо реальных проблем.