[英]LinkButton postback but click event not fired
嗨,大家好
這是我在stackoverflow上的第一篇文章(順便說一句,這是我最喜歡的網站,用於尋找答案)。 在最終承認失敗之后,我希望有人可以幫我解決這個問題......
這個問題已經被多次提出過,但我找到的建議解決方案都沒有提供幫助。 提前為一篇冗長的帖子道歉,但我想避免任何人浪費時間建議我已經嘗試過的事情。
下面的代碼一直工作到最近,其結構從未被觸及(盡管對子頁面進行了無關的更改)。 無論如何,它突然停止了工作。 現在即使是最簡化的按鈕也不會觸發。
設定
問題
在LB上單擊,回發發生正常,但服務器端點擊事件永遠不會被命中。
碼
頁:
var ctrlX = base.LoadControl("~/somedir/someucl.ascx");
=> loads fine
ascx文件(除了按鈕之外的所有數據刪除):
<asp:DataList ID="dlX" RepeatLayout="Table" runat="server">
<HeaderTemplate></HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<asp:LinkButton ID="btnX" OnClick="btnX_Click" CausesValidation="false" runat="server" />
</td>
</tr>
</ItemTemplate>
<FooterTemplate></FooterTemplate>
代碼隱藏:
protected void btnX_Click(object sender, EventArgs e)
{
// do something
}
事情嘗試過
挖掘出有效的備份並檢查代碼更改
(發現沒有影響結構或用戶控制)
設置LinkButton CausesValidation true / false
使用不同的設置一次包裝一個UpdatePanel
用戶控件
數據列表
LinkButton的
在usercontrol init / load事件中重新連接eventhandler:
IEnumerable<Control> controls = Utils.FlattenChildren(dlX); foreach (var button in controls.OfType(LinkButton)()) { if (button.ID.Contains("btnX")) button.Click += new EventHandler(btnX_Click); }
無論我在哪里添加上面的代碼,都會找到所有按鈕並附加事件,但是click事件不會觸發((LinkButton)= LinkButton里面<>;無法讓它顯示正確,仍然與編輯器有點掙扎) 。
在頁面加載事件中手動添加PostBackUrl
而已。 現在,我想不出還有什么可以嘗試或檢查(也許在回發的斷點上下文菜單中有什么東西?)。
因為ucl加載正常,並且回發工作正常,我懷疑問題是在ucl中的某個地方,而不是加載它的子頁面。 但也許不是。
如果可能的話,我想避免使用變通方法(我需要上面沒有顯示的按鈕命令參數,並且不喜歡使用隱藏字段或查詢字符串的jquery等解決方案)。
除了任何事情,我真的想了解是什么導致了這一點。
顯然,我錯過了一些東西......感謝任何人花時間閱讀/幫助這個!
========按要求添加代碼隱藏=======
我已將父頁面代碼簡化為最小化,刪除所有方法調用,並根據Eoins建議將ucl加載移動到頁面的init事件中。 ucl代碼仍然如上所示。 DL和LB顯示正常,點擊后會觸發回發,點擊ucl頁面加載事件,但和之前一樣,服務器點擊事件沒有被點擊。
protected override void OnInit(EventArgs e)
{
var ctrlX = base.LoadControl("~/someucl.ascx");
if (ctrlX == null)
return;
DataList dlX = (DataList)ctrlX.FindControl("dlX");
if (dlX == null)
return;
DummyCollection x = new DummyCollection();
x.Add(null); // ok since the test LB does not draw on the datasource
dlX.DataSource = x;
dlX.DataBind();
pnlX.Controls.Add(ctrlX);
base.OnInit(e);
}
var ctrlX = base.LoadControl("~/somedir/someucl.ascx");
這些代碼到底在哪里?
您需要確保創建它並在頁面生命周期中盡早將其添加到控件集合中,以便在隨后的回發中及時創建和連接。 即在oninit事件。
protected override OnInit(...)
{
base.OnInit(...);
var ctrlX = base.LoadControl("~/somedir/someucl.ascx");
this.Controls.Add(ctrlX);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.