2009-11-09 47 views
0

我有這樣的代碼在用戶控件如下:爲什麼ViewState在控件的屬性在其父級的Control.Render方法中被修改時丟失了?

Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter) 
    If someCondition Then 
     childControl.Enabled = false 
    End If 

    MyBase.Render(writer) 
End Sub 

每當someCondition是真實的,childControl.Enabled被渲染事件,爲childControl ViewState中被破壞時設置爲false(即,如果它是一個文本框,用戶輸入的文本丟失)。

請注意,只有ViewState丟失了......該控件仍然使用正確的屬性值進行第一次渲染。僅在回發時,從ViewState恢復屬性時實際上會丟失值。

時間軸是如下:

  • 的Page_Load(初始)
    屬性經由碼集。
  • SaveViewState
  • Render
    屬性被修改。
  • 發生回傳。
  • LoadViewState
  • 的Page_Load
    不變控制 值仍然可用,但不得不在Render方法中設置屬性的控件是空白。
  • SaveViewState

我的理解是,ViewState中調用Control.SaveViewState,該呼叫Control.Render之前發生期間成爲固定的...但有一些細微差別,我很想念?

回答

2

是否在空值後禁用了控件?或者什麼也不發佈?說實話,我忘了。但是,如果他們發佈空值,那麼您的視圖狀態正在被覆蓋,就像您在文本框中鍵入新內容然後發佈頁面一樣。

+0

除了在頁面呈現時正確顯示值。只有在回傳之後,缺少的ViewState纔是明顯的。換句話說,如果childControl – AaronSieb 2009-11-09 21:12:20

+0

這並不令人驚訝,它呈現罰款......但你失去了LoadViewState和Page_Load之間的一步...控制更新與張貼的表單值的步驟。因此你的問題。 – Bryan 2009-11-09 21:23:05

+0

你知道嗎,我想你可能是對的。爲了做到這一點,控件必須做出是否要在ViewState中讀取或在Render方法被調用之前提交表單的決定。我會仔細檢查輸出結果,看看會發生什麼。 – AaronSieb 2009-11-09 22:08:56

相關問題