Я читал 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 сеанс обновляется автоматически ... Но я не могу понять, где, когда и КАК.
Спасибо всем, кто ответит.