20

OK、リピーターを文字通り何百回も問題なく使用しましたが、今日は何かがうまくいきません。リピーターがあり、itemCommand イベントをサブスクライブしていますが、コマンドを実行すると、ページはポストバックされますが、イベントは発生しません。

これを回避するには、ポストバックごとにデータバインディングを行う必要があります。

私のリピーターは次のようになります。

<asp:Repeater id="MyRepeater" runat="server" onitemcommand="MyRepeater_ItemCommand">
<ItemTemplate>
    <li>
    <asp:Label id="Label" runat="server" />
    <asp:LinkButton id="LinkButton1" runat="server" commandname="Complete" commandargument='<%# Eval("MyID") %>' text='<%# Eval("Title") %>' />
    </li>
</ItemTemplate>
</asp:Repeater>

そして私のコードビハインドは次のようになります:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
    SetupPage();
    }
}

private void SetupPage()
{
    // Do other stuff

    MyRepeater.DataSource = Repository.GetStuff()
    MyRepeater.DataBind();
}


protected void MyRepeater_ItemCommand(object sender, RepeaterCommandEventArgs e)
{


// Do all my stuff here
}

if (!IsPostBack) 行をコメントアウトしない限り、MyRepeater_ItemCommand は呼び出されません。それがコメントアウトされ、リピーターが各ポストバックでデータバインドされると、問題なく動作します。私は他の多くのページでこれを行ってきましたが、これではうまくいかないようです。

他の誰かがこの動作に遭遇したり、解決策を持っていますか?

4

12 に答える 12

24

ほとんどの場合、ページの ViewState を無効にしています。

その理由は、ポストバックを実行すると、リピーター内のすべてのコントロールが正常にビューステート内のデータから再構築されるためです。次に、コントロールの ID に基づいてイベントを受け取るオブジェクトが識別され、イベントがルーティングされます。

ビューステートを無効にすると、ポストバック中にコントロール ツリーが再構築されないため、イベントを受け取るコントロールがメモリに存在しません。だからイベントは死にます。

本当にビューステートを無効にしたいが、それでもイベントを受け取りたい場合は、回避策があります (まったく汚れていません)。それについてブログ エントリを書くことを長い間考えていたので、必要に応じて、通常の雑用から少し離れて説明することができます。

編集: 回避策はここで説明されています: http://petesdotnet.blogspot.dk/2009/08/asp.html

于 2009-08-24T12:56:02.753 に答える
6

if (!IsPostBack)これによりリピーターの再バインドが妨げられており、アイテム コマンド イベントがポストバック後に行を見つけられなかったため、削除してください。

于 2011-11-22T18:15:08.370 に答える
5

私は同じ問題を抱えており、更新パネルを使用する以外に、モーダルに必須フィールドバリデーターがあります。リピーターの LinkBut​​tons が requiredFieldValidor イベントをトリガーすることがわかったので、リピーターの LinkBut​​tons に CausesValidation="false" を追加しました。期待どおりに動作します。

于 2015-11-13T03:05:55.110 に答える
2

ImageButtonを使用すると、リピーターでこの問題が発生します... LinkBut​​tonが機能するときにこのソリューションをネットで検索しましたが、ImageButtonは機能しません...

では、LinkBut​​ton は機能するのでしょうか。だから私はそれを使用します:)

<asp:LinkButton  CommandName="Filter" CommandArgument='<%# Eval("ID") %>' Text="" runat="server" >
<asp:image imageurl='<%#Eval("Img") %>' runat="server"/>

</asp:LinkButton> 

だから、画像は<A>タグの中にあります

楽しんで :)

于 2012-02-16T07:18:38.913 に答える
2

リンクボタンのPostBackUrlプロパティを削除し、ItemCommand を起動しました。ポストバックが最初に実行されると思います。

于 2012-06-22T07:51:22.363 に答える
1

ページに検証を設定している可能性があります。リンクボタンにcausevaliation = "false"という新しい属性を設定します。M きっと問題は解決する

于 2014-03-07T09:22:10.070 に答える
1

私は同様の問題を抱えていました - いくつかの控えめな検証コントロールがページの他の場所で起動していたことが判明しました。それを理解するのに1日しかかかりませんでした...

于 2014-04-24T12:46:16.380 に答える
0

私はこれについて肯定的ではありませんが、 ItemCommandイベントを引き起こすボタンのCommandNameプロパティとオプションでCommandArgumentプロパティを設定する必要があるかもしれません。そうしないと、ASP.NETは、イベントを発生させたいボタンがページにないと想定します。あなたはそれを試すことができます。

さらに、コマンド名を区別しない場合は、代わりに各ボタンのClickイベントを使用してみませんか?リピーターのItemCreatedまたはItemDataBoundにあるものをサブスクライブするだけです。

于 2009-08-24T13:10:46.267 に答える
0

これを試して:

protected void Page_Load(object sender, EventArgs e)
{
    SetupPage();
}

ネストされたリピーターを使用する場合は、内部のリピーターを再バインドする必要があります

于 2012-10-30T14:16:47.340 に答える
0

Page_load の代わりに Page_init を使用してみてください。これで問題が解決するはずです。

于 2009-10-23T03:36:14.623 に答える