2010-06-09 58 views
1

使用反射器,我發現在System.Web.UI.WebControls.Parameter類以下代碼:ASP.NET ParameterCollection(或其ParametersChanged事件)是否依賴於視圖狀態?

internal void UpdateValue(HttpContext context, Control control) 
{ 
    object obj2 = this.ViewState["ParameterValue"]; 
    object obj3 = this.Evaluate(context, control); 
    this.ViewState["ParameterValue"] = obj3; 
    if (((obj3 == null) && (obj2 != null)) || 
      ((obj3 != null) && !obj3.Equals(obj2))) 
    { 
     this.OnParameterChanged(); 
    } 
} 

this.OnParameterChanged(); 

是什麼觸發到底ParametersChanged -event,爲I(在OnParameterChanged通過this._owner.CallOnParametersChanged())理解。

現在我的問題是:如果EnableViewState設置爲false(例如在整個頁面上)會發生什麼?並作爲附錄:我使用ControlParameter s指向SelectedValueDropDownList

我以爲這將意味着:

  1. obj2要麼是已經在同一個請求先前設置(即UpdateValue之前已經調用)或null如果沒有其他價值尚未設置值。
  2. 作爲DropDownList s SelectedValue不能是nullobj3永遠不會爲空。
  3. OnParametersChanged將始終被調用第一次UpdateValues在任何請求中被調用。

但如果相同的條目回發期間裝入DropDownList ASP.NET保留在整個回傳列表中選擇即使ViewState中被禁用(我只能猜測是如何工作的,但它確實。 ..)。

這歸結爲以下幾點:如果ViewState被禁用,並且在每個請求中相同的值被加載到DropDownList並且用戶已經選擇了「很久以前」的條目X並且通過除改變選擇之外的其他方式觸發了回發在DropDownList中,ASP.NET會在ParameterCollecion上觸發一個ParametersChanged -event(因爲上面的列表中有#3),儘管在我的理解中參數沒有改變它的值。

我錯了,或者這是否意味着我不能(不應該)禁用ViewState,如果這種行爲造成麻煩?


UPDATE(不直接相關的問題)

只是爲了擺脫這個問題怎麼DropDownList通過後回來,如果視圖狀態禁用保留了選擇的價值:通過其實施的IPostBackDataHandler ...

反射顯示(在DropDownList):

protected virtual bool LoadPostData(string postDataKey, 
     NameValueCollection postCollection) 
{ 
    string[] values = postCollection.GetValues(postDataKey); 
    this.EnsureDataBound(); 
    if (values != null) 
    { 
     base.ValidateEvent(postDataKey, values[0]); 
     int selectedIndex = this.Items.FindByValueInternal(values[0], false); 
     if (this.SelectedIndex != selectedIndex) 
     { 
      base.SetPostDataSelection(selectedIndex); 
      return true; 
     } 
    } 
    return false; 
} 

因此,它基本上檢索POST ed數據中選定項目的值,並且如果它可以在DropDownList包含的項目列表中找到包含此項目的項目,則將其設置爲選定項目。

回答

0

您是對的:如果您希望ASP.NET Web控件的「已更改」事件和行爲正常工作,則無法禁用viewstate。

它們用來確定是否有變化的基本機制是將viewstate中序列化的值與等效發佈值(如果有)進行比較。 TextBox.TextChanged(舉例來說)它的類文件中明確闡述了這一點:

TextBox控件必須堅持崗位之間的一些 值到服務器 此事件才能正常工作。確保 該視圖狀態已爲此 控件啓用。