2011-05-29 120 views
0

我一直在閱讀由史蒂文桑德森專業ASP.NET MVC2,我仍然無法找出有關會議的東西。 在書中,他講述瞭如何使用自定義模型聯編程序基於會話開發購物車,以實現會話持久性。一切工作正常,但我無法弄清楚它是如何真正在引擎蓋下工作。 由於它是我會寫一個簡化版ASP.NET MVC會話

計數器

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()); 

正如你看到有用來獲取會話內容的聲明 專櫃=(計數器)controllerContext.HttpContext.Session [counterSessionKey] 但是沒有關於保存進入會話的聲明。我希望後面的語句在某處: controllerContext.HttpContext.Session [counterSessionKey] = counter; 但是這段代碼沒有出現在任何地方

儘管如此,它仍然有效。 不知何故,當更新Counter對象時,會話會自動更新......但我無法理解何時何地。 感謝任何人會回覆。

回答

0

計數器對象是一個類(引用類型),所以已經在Session對象中的值被計數器變量引用。見http://www.albahari.com/valuevsreftypes.aspx

當您更新計數器對象中的值時,您將在會話中已存在的副本中更新它們。

請注意,如果您使用會話服務器或SQL會話服務器,則這可能不起作用,因爲它們會與Session執行不同的操作。目前,您正在使用Session值的單個實時集合,這就是爲什麼它可以工作。該對象在請求之間的ASP.NET進程中保持活動狀態。

+0

是的。我做了一些實驗,它確實有效。我不得不說,我懷疑這是與參考類型有關,但在我以前的實驗中,我使用的是不是參考的int類型,因此我沒有得出結論。 無論如何非常感謝你。 – user711643 2011-05-29 07:01:59