首先,我發現了一些類似的問題。其中之一是here,它沒有正確的答案。服務器控件事件無法正確觸發
我正在寫自定義服務器控件,其中有文本屬性和點擊事件。一切都很好(點擊事件正在觸發和發件人對象具有正確的值),但只有當我只在頁面上的一個地方使用。
此示例工作正常(如果SimpleControl1.Text具有價值「第一控制」,在響應我收到正確的值):
protected void SimpleControl1_Click(object sender, EventArgs e)
{
SimpleControl sc = sender as SimpleControl;
if(sc != null)
{
Response.Write(sc.Text);
}
}
但是,如果我在同一個加第二控制頁面(SimpleControl2文本「二控制」),我的第一個控制器的點擊事件將不再工作:
protected void SimpleControl2_Click(object sender, EventArgs e)
{
SimpleControl sc = sender as SimpleControl;
if (sc != null)
{
Response.Write(sc.Text);
}
}
所以,如果我點擊第一個控件,我正在接收「第二控件」文本。
我想我錯過了一些東西,但我不確定是什麼。
如何解決此問題?
這裏是我的簡單的Web控件:
public class SimpleControl : WebControl, IPostBackEventHandler
{
public string Text { get; set; }
protected override void OnInit(EventArgs e)
{
Page.RegisterRequiresRaiseEvent(this);
Page.RegisterRequiresControlState(this);
base.OnInit(e);
}
private static readonly object EventClick = new object();
protected virtual void OnClick(EventArgs e)
{
EventHandler eventHandler = (EventHandler)Events[SimpleControl.EventClick];
if (eventHandler != null) { eventHandler(this, e); }
}
public event EventHandler Click
{
add { Events.AddHandler(EventClick, value); }
remove { Events.RemoveHandler(EventClick, value); }
}
protected override object SaveControlState()
{
object state = base.SaveControlState();
return new object[] { state, Text };
}
protected override void LoadControlState(object state)
{
object[] states = state as object[];
if (states != null)
{
base.LoadControlState(states[0]);
Text = (string)states[1];
}
}
protected override void RenderContents(System.Web.UI.HtmlTextWriter writer)
{
writer.AddAttribute(HtmlTextWriterAttribute.Id, this.ClientID);
writer.AddAttribute(HtmlTextWriterAttribute.Name, this.UniqueID);
writer.AddAttribute(HtmlTextWriterAttribute.Onclick, Page.ClientScript.GetPostBackEventReference(this, "Click"));
writer.RenderBeginTag("div");
writer.Write(Text);
writer.RenderEndTag();
base.RenderContents(writer);
}
public void RaisePostBackEvent(string eventArgument)
{
this.OnClick(EventArgs.Empty);
}
}
編輯
markap
<cc1:SimpleControl ID="SimpleControl1" runat="server"
Text="First control" OnClick="SimpleControl1_Click" />
<cc1:SimpleControl ID="SimpleControl2" runat="server"
Text="Second Control" OnClick="SimpleControl2_Click" />
附:我也刪除了控制狀態支持,但它沒有解決問題。
則可以使用該控制 – 2013-04-21 10:25:23
的裁判我認爲**對象狀態= base.SaveControlState()**狀態可以爲空。 – 2013-04-21 13:56:44
@minhcat_vo控制狀態不能產生此問題。我完全刪除了控制狀態支持並更改爲ViewState,但它仍然觸發第二個事件。 – 2013-04-21 14:08:32