Ссылка класса Asp.net MVC в сессии - PullRequest
2 голосов
/ 14 марта 2010

если я помещаю пользовательский класс в сеанс, то в методе действия я получаю экземпляр этого класса из сеанса и заполняю некоторые поля, я заметил, что когда другой контроллер получает этот класс из сеанса, эти поля заполняются. Хотя после первого вызова обновленный класс не был сохранен в сеансе.

это типичное поведение для объектов сеанса?

Я подумал, что мне нужно использовать ключевое слово static в классе в сеансе, чтобы это произошло

спасибо

Ответы [ 3 ]

6 голосов
/ 14 марта 2010

Поскольку ваш класс является ссылочным типом, это нормальное поведение. Вот что происходит в памяти:

  1. Вы создаете экземпляр объекта и помещаете его в сеанс

    var someObj = new SomeObject();
    Session["someObj"] = someObj;
    

    На этом этапе в куче создается новый объект, и Session["someObj"] указывает на этот объект.

  2. Вы извлекаете объект из сеанса в контроллере A и изменяете некоторое свойство, но не вызываете Save:

    var someObj = (SomeObject)Session["someObj"];
    someObj.SomeProp = "new value";
    

    Теперь someObj указывает на тот же объект, который вы создали ранее в куче. Поскольку someObj является только ссылкой, вы фактически изменяете исходный объект в памяти.

  3. Вы извлекаете объект из сеанса в контроллере B:

    var someObj = (SomeObject)Session["someObj"];
    

    Теперь someObj указывает на ту же ячейку памяти, которая была изменена.

1 голос
/ 14 марта 2010

это типичное поведение для объектов сеанса?

Ну да, но это типично для .NET объектов в целом. Вы взяли ссылку, поэтому вы меняли исходный объект, на который все еще указывает сеанс.

0 голосов
/ 14 марта 2010

Поскольку ваша сессия находится в памяти, это ожидаемое поведение. Если вы сохраняете сеанс во внешнем хранилище, вам нужно сохранить объекты обратно в сеанс, чтобы получить тот же самый вид поведения. Я бы постарался избежать такого развития событий, потому что, когда вы меняете магазин, поведение совершенно иное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...