0

皆さん、こんにちは

これは、stackoverflow に関する私の最初の投稿です (答えを見つけるための私のお気に入りのサイトです)。最終的に敗北を認めた後、誰かがこの問題を解決してくれることを願っています...

この質問はすでに数回尋ねられていますが、私が見つけた提案された解決策はどれも役に立ちませんでした. 長い投稿を前もってお詫びしますが、私がすでに試したことを提案するために時間を無駄にすることは避けたいと思います.

以下のコードは最近まで機能しており、それ以来、その構造は変更されていません (ただし、子ページには無関係な変更が加えられています)。いずれにせよ、突然機能しなくなりました。これで、最も単純化されたボタンでさえ起動しなくなりました。

設定

  • VS 2008 C#、IIS 7 (動作を停止する前からセットアップに変更はありません)

  • ネストされたマスターページ (メイン + 1 つの子)

  • 子ページに datalist を含む ucl を動的にロード
    (つまり、MP => ネストされた MP => 子ページ => ucl => datalist => linkbutton)

  • linkbutton クリック イベントも 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 に追加

  • usercontrol
    datalist
    linkbuttonの周りでさまざまな設定を使用して、UpdatePanel を一度に 1 つずつラップします。

  • ユーザーコントロールのinit / loadイベントでイベントハンドラーを再アタッチします:

    IEnumerable<Control> controls = Utils.FlattenChildren(dlX);
    
    foreach (var button in controls.OfType(LinkButton)())
    {
        if (button.ID.Contains("btnX"))
            button.Click += new EventHandler(btnX_Click);
    }
    

    上記のコードを追加すると、すべてのボタンが見つかり、イベントが添付されますが、クリックイベントは発生しません ((LinkBut​​ton) = LinkBut​​ton inside <>; 正しく表示できず、エディターで少し苦労しています) .

  • ページ読み込みイベントに PostBackUrl を手動で追加する

  • ロード/ポストバック イベント間でクライアント ID を比較 => それらは常に一致します



それでおしまい。今のところ、他に何を試したりチェックしたりするべきか考えられません (ポストバックのブレークポイント コンテキスト メニューにあるものでしょうか?)。

UCL が正常にロードされ、ポストバックが正常に機能しているため、子ページがロードするのではなく、UCL のどこかに問題があると思われます。しかし、そうではないかもしれません。

可能であれば、回避策を避けたいと思います (上に示していないボタン コマンド引数が必要であり、隠しフィールドやクエリ文字列を含む jquery などのソリューションには熱心ではありません)。

何よりも、何が原因なのか本当に知りたいです。

明らかに、私は何かが欠けています...これを読んだり助けたりして時間を割いてくれた人に感謝します!



======== 要求された追加のコードビハインド =======

親ページのコードを最小限に単純化し、すべてのメソッド呼び出しを削除し、Eoins の提案に従って、ページの init イベントで ucl ロードを移動しました. 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);
    }
4

1 に答える 1

2
var ctrlX = base.LoadControl("~/somedir/someucl.ascx");

このコードはあなたのページのどこにありますか?

ページのライフサイクルの十分早い段階で作成し、コントロール コレクションに追加して、その後のポストバックで作成され、時間内に接続されるようにする必要があります。つまり、oninit イベントで。

protected override OnInit(...)
{
   base.OnInit(...);

   var ctrlX = base.LoadControl("~/somedir/someucl.ascx");

   this.Controls.Add(ctrlX);
}
于 2013-05-13T12:48:10.890 に答える