我在與事件處理程序一直沒有,儘管改變,我所知道的領域上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事件做出了根本性的錯誤假設?
ASP.NET頁面生命週期:http://msdn.microsoft.com/en-us/library/ms178472.aspx – smartcaveman 2011-03-03 19:37:19