2011-03-03 36 views
0

我在與事件處理程序一直沒有,儘管改變,我所知道的領域上HiddenFields射擊的問題。在每個回發ASP HiddenField處理的ValueChanged火災自定義控件

我有一個ASCX用戶控件,我靜態聲明的一些元素:

MyControl.ascx:

<div id="AnItem" runat="server"> 
    <asp:Textbox id="TextBox1" runat="server" /> 
    <asp:HiddenField id="HiddenField1" runat="server" /> 
</div> 

(有明顯多了很多那裏,但是這是值得注意的標記)

MyControl.ascx.cs:

protected override void OnInit(EventArgs e){ 
    base.OnInit(e); 
    if (SelectedValue != null){ 
     TextBox1.Text = SelectedValue.Text; 
     HiddenField1.Value = SelectedValue.ID.ToString(); 
    } 
} 

protected override void OnLoad(EventArgs e){ 
    base.OnLoad(e); 
    if (String.IsNullOrEmpty(TextBox1.Text)) 
     TextBox1.Attributes["style"] = "display:none"; 
    TextBox1.TextChanged += ItemTouched; 
    HiddenField1.ValueChanged += ItemTouched; 
} 

protected void ItemTouched(object sender, EventArgs e){ 
    // process changed values 
} 

代碼似乎unconventi onal因爲我省略了與我的問題無關的項目(我假設)。

我的控制實際上是動態使用的包裝類,我可以序列創建:

[Serializable] 
public class ListControl{ 
    public void GenerateControl(TemplateControl parent){ 
     var control = parent.LoadControl("~/MyControl.ascx") as MyControl; 
     control.Options = _options; 
     control.SelectedValue = _selectedValue; 
     return control;  
    } 

    private IList<SelectableOption> _options; 
    private SelectionOption _selectedValue; 
} 

(在此包裝的原因是由於大量的遺留代碼基礎,是創造可選擇的名單太慢值。將生成_options列表一次,然後保持在該會話以加速回發執行。)

ItemTouched被附接到每一個可以由用戶觸摸(或由JavaScript操縱)元素。我的問題是,它被解僱的每一個回發 - 即使HiddenField1沒有在客戶端修改(我已經刪除了所有的JavaScript碰過它證實了這一點)。

我不知所措,爲什麼處理程序被解僱的價值沒有被感動。當沒有設置控制值時(例如在我的OnInit方法中)它不會觸發,但如果它們是「預先設置的」,它總是會發生。我不希望改變處理火,如果我附上事件處理程序設置默認值後,但是這似乎並不如此。我是否對ASP.NET事件做出了根本性的錯誤假設?

+0

ASP.NET頁面生命週期:http://msdn.microsoft.com/en-us/library/ms178472.aspx – smartcaveman 2011-03-03 19:37:19

回答

1

這已經有一段時間,但如果我沒有記錯HiddenField或TextBox控件的ValueChanged火基於其當前值與存儲在ViewState中的值進行比較。由於你是動態地創建這些控件,我猜他們的viewstate沒有得到適當的補充(或足夠早) - 然後觸發ValueChanged事件處理程序觸發(因爲它們的值不同於存儲在ViewState中的值) 。

真正理解發生了什麼的最佳方法是啓用.NET Framework上的調試:http://msdn.microsoft.com/en-us/library/cc667410.aspx並在ValueChanged所在區域設置一些斷點。然後你可以看到是什麼狀況導致它,這應該有助於你弄清楚如何解決它。

+0

好悲傷,謝謝託尼。這的確是問題 - 在OnLoad中分配值太遲了,因爲默認值已經存在於視圖狀態中。令人沮喪的是,我的代碼最初是以這種方式工作的,並且由於我的控件的*錯誤實例*上的斷點,它出現我的「_options」沒有實例化。原來我只是打破了一個沒有值應該被添加的實例。兒! – 2011-03-03 22:49:49

+0

很高興幫助!而實際上,我認爲舊值被保存在了ControlState-而不是ViewState的(因爲他們所需要的控制功能),但是這兩個領域同時獲得水合反正。 – Tony 2011-03-04 17:33:23

相關問題