簡體   English   中英

LinkBut​​ton回發但未點擊事件

[英]LinkButton postback but click event not fired

嗨,大家好

這是我在stackoverflow上的第一篇文章(順便說一句,這是我最喜歡的網站,用於尋找答案)。 在最終承認失敗之后,我希望有人可以幫我解決這個問題......

這個問題已經被多次提出過,但我找到的建議解決方案都沒有提供幫助。 提前為一篇冗長的帖子道歉,但我想避免任何人浪費時間建議我已經嘗試過的事情。

下面的代碼一直工作到最近,其結構從未被觸及(盡管對子頁面進行了無關的更改)。 無論如何,它突然停止了工作。 現在即使是最簡化的按鈕也不會觸發。

設定

  • VS 2008 C#,IIS 7(在設置停止工作之前沒有設置更改)

  • 嵌套母版頁(主要+ 1個孩子)

  • 在子頁面中使用datalist動態加載ucl
    (即MP =>嵌套MP =>子頁=> ucl => datalist => linkbutton)

  • linkbutton click事件也駐留在ucl中


問題

在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  
}



事情嘗試過

  • 清潔解決方案
  • 挖掘出有效的備份並檢查代碼更改
    (發現沒有影響結構或用戶控制)

  • 設置LinkBut​​ton CausesValidation true / false

  • 剝離datalist和LinkBut​​ton到最基本的東西
  • 將AddressOf =“btnX.click”添加到LinkBut​​ton
  • 使用不同的設置一次包裝一個UpdatePanel
    用戶控件
    數據列表
    LinkBut​​ton的

  • 在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事件不會觸發((LinkBut​​ton)= LinkBut​​ton里面<>;無法讓它顯示正確,仍然與編輯器有點掙扎) 。

  • 在頁面加載事件中手動添加PostBackUrl

  • 比較加載/回發事件之間的客戶端ID =>它們總是匹配



而已。 現在,我想不出還有什么可以嘗試或檢查(也許在回發的斷點上下文菜單中有什么東西?)。

因為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM