2008-10-21 22 views
1

這工作,但它是正確的方式來做到這一點?在自定義服務器控件中維護狀態的正確方法是什麼?

我有一個自定義的服務器控件,它上面有一個[input]框。我希望它能模仿ASP.NET TextBox,但不完全。當文本框呈現時,我有一個JavaScript,允許用戶選擇然後放置在該輸入框中的值。

我在控件上有一個公共文本屬性。在獲取/設置我得到/設置控件的視圖狀態 - 該部分很容易,但是當通過javascript填充控件時,實際上並沒有調用文本獲取,使用JavaScript設置此公開屬性的正確方法是什麼(或者即使用戶只是在框中鍵入)?

編輯: 在OnInit我確保通過進入表單值來維護狀態。

protected override void OnInit(EventArgs e) 
    { 
     base.OnInit(e); 

     if (HttpContext.Current.Request.Form["MyInputBoxValue"] != "") 
     { 
      ViewState["MyInputBoxValue"] 
       = HttpContext.Current.Request.Form["MyInputBoxValue"]; 
     } 
    } 

然後得到的值實際上早在發生在HtmlTextWrite,我這樣做:

protected override void RenderContents(HtmlTextWriter output) 
{ 

     // There is an input control here and i set its value property 
     // like this using the Text internal defined. 
     output.Write("<input value=" + Text + ">..... 

} 

感謝

回答

1

我發現使用IStateManager的效果最好。

例如:

partial class MyControl : System.Web.UI.UserControl, IStateManager 
{ 
    [Serializable()] 
    protected struct MyControlState 
    { 
     public bool someValue; 
     public string name; 
    } 

    protected MyControlState state; 

    public bool someValue { 
     get { return state.someValue; } 
     set { state.someValue = value; } 
    } 

    public bool IsTrackingViewState { 
     get { return true; } 
    } 

    protected override void LoadViewState(object state) 
    { 
     if ((state != null) && state is MyControlState) { 
      this.state = state; 
     } 
    } 

    protected override object SaveViewState() 
    { 
     return state; 
    } 

    protected override void TrackViewState() 
    { 
     base.TrackViewState(); 
    } 
} 

getDefaultState()將只加載一些理智默認進入一個新的狀態結構。狀態在頁面的視圖狀態中進行跟蹤,並且ASP將爲您處理它。

(上面的代碼從VB移植,而不是檢查,希望我沒有做任何錯誤,但它應在整個反正得到點)

+0

這工作就像一個冠軍,尤其是,存在一個值我不得不設置檢查項目是髒: 如果(!((IDictionary)_viewstate).Contains(「CustomValue」)|| _viewstate.IsItemDirty(「CustomValue」)) – schmoopy 2008-10-21 15:44:29

0

如果你需要保持在回髮狀態,您必須提供自己的方法 記錄用戶在客戶端 上用您的控件完成的操作,並稍後在服務器上用 更新服務器控件,或者在t時重新執行客戶端上的更改他刷新頁面。

0

嗯,我想我們可以利用現有的ASP.NET持續性..嘗試繼承最基本的後置狀態持久控制(我在想asp:隱藏)。然後,只需重寫渲染並添加所需的所有爵士樂。

讓我知道,如果它的工作原理,那麼我不會有測試:)

相關問題