ASP.NET MVC Session - PullRequest
       1

ASP.NET MVC Session

0 голосов
/ 29 мая 2011

Я читал PRO ASP.NET MVC2 Стивена Сандерсона и до сих пор не могу понять что-то о сессии В книге он рассказывает, как разработать корзину на основе сеанса, используя привязку пользовательской модели для сохранения сеанса. Все работает нормально, но я не могу понять, как это работает под капотом. Поскольку кода достаточно, я напишу упрощенную версию

Счетчик

public class Counter
{
    public int counter = 0;

    public void Increment(){
        counter++;
    }
}

CounterController

public ActionResult Index(Counter counter)
{
   counter.Increment();
   return View(counter);
}

CounterCustomModelBinder

public class CounterCustomModelBinder: IModelBinder
{
    private const string counterSessionKey = "_counter";

    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        Counter counter = (Counter)controllerContext.HttpContext.Session[counterSessionKey];
        if (counter == null)
        {
            counter = new Counter();
            controllerContext.HttpContext.Session[counterSessionKey] = counter;
        }
        return counter;
    }
}

Global.asax

...
ModelBinders.Binders.Add(typeof(Counter), new CounterCustomModelBinder());

Как вы видите, есть оператор для извлечения содержимого сеанса Counter counter = (Counter) controllerContext.HttpContext.Session [counterSessionKey]; Но нет никакого заявления для сохранения в сессии. Я ожидал бы последующее утверждение где-то: controllerContext.HttpContext.Session [counterSessionKey] = counter; Но этот код нигде не появляется

Тем не менее, это все еще работает. Каким-то образом при обновлении объекта Counter сеанс обновляется автоматически ... Но я не могу понять, где, когда и КАК. Спасибо всем, кто ответит.

1 Ответ

0 голосов
/ 29 мая 2011

Объект счетчика является классом (ссылочным типом), и поэтому на значение, уже находящееся в объекте Session, ссылается переменная счетчика. Смотри http://www.albahari.com/valuevsreftypes.aspx.

Когда вы обновляете значения в объекте счетчика, вы обновляете их в копии, которая уже существует в сеансе.

Обратите внимание, что это, вероятно, не будет работать, если вы используете сервер сеансов или сервер сеансов SQL, поскольку они делают разные вещи с сеансом. Прямо сейчас вы используете одну живую коллекцию значений Session, поэтому она работает вообще. Объект поддерживается в процессе ASP.NET между запросами.

...