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は呼び出されません。それがコメントアウトされ、リピーターが各ポストバックでデータバウンドを取得すると、正常に機能します。私は他の多くのページでこれを行ってきましたが、これではうまくいかないようです。
他の誰かがこの動作に遭遇したり、解決策を持っていますか?
ほとんどの場合、ページのViewStateを無効にしています。
その理由は、ポストバックを実行すると、リピーターのすべてのコントロールがビューステートのデータから通常どおり再構築されるためです。次に、イベントを受信する必要のあるオブジェクトがコントロールのIDに基づいて識別され、イベントがルーティングされます。
ビューステートを無効にすると、ポストバック中にコントロールツリーが再構築されないため、イベントを受信する必要のあるコントロールがメモリに存在しません。そのため、イベントは終了します。
本当にビューステートを無効にしたいが、それでもイベントを受信したい場合は、回避策があります(そしてそれはまったく汚れていません)。私は長い間それについてブログエントリを書くことを考えていたので、あなたが望むなら、私は私の通常の雑用から少し時間を取って、それを説明することができます。
編集:回避策はここで説明されています: http://petesdotnet.blogspot.dk/2009/08/asp.html
if (!IsPostBack)
を削除します。これにより、リピーターが再バインドできなくなり、アイテムコマンドイベントがポストバック後に行を見つけることができませんでした。
同じ問題があり、更新パネルを使用する以外に、モーダルに必須のフィールドバリデーターがあります。リピーターのLinkButtonsがrequiredFieldValidorイベントをトリガーすることがわかり、リピーターのLinkButtonsにCausesValidation = "false"を追加しました。期待どおりに動作します。
ImageButtonを使用すると、リピーターでこの問題が発生します... LinkButtonが機能するときにこのソリューションをネットで検索しましたが、ImageButtonは機能しません...
それなら、LinkButtonは機能すると思いますか?だから私はそれを使用します:)
<asp:LinkButton CommandName="Filter" CommandArgument='<%# Eval("ID") %>' Text="" runat="server" >
<asp:image imageurl='<%#Eval("Img") %>' runat="server"/>
</asp:LinkButton>
したがって、画像は<A>
タグ内にあります
楽しんで :)
LinkbuttonのPostBackUrlプロパティを削除し、ItemCommandを起動しました。ポストバックが最初に実行されると思います。
これは、ページに検証を設定している可能性があります。したがって、新しい属性、causesvalidation = "false"を[リンク]ボタンに設定します。それが問題を解決すると確信している
私にも同様の問題がありました-いくつかの目立たない検証コントロールがページの他の場所で実行されていたことが判明しました。それを理解するのに1日しかかかりませんでした...
それがあり得るもう1つのこと(ちょうど私に起こったように):あなたのページが事前にレンダリングされたときにあなたのデータバインドが行われる場合、それはitemコマンドを処理しません。ロードまたは初期化に切り替えると、問題ありません。
私はこれについて肯定的ではありませんが、CommandNameおよびオプションでCommandArgumentプロパティを設定して、ItemCommandイベントを発生させるボタンを設定する必要があるかもしれません。そうしないと、ASP.NETは、イベントを発生させたいボタンがページにないと想定します。あなたはそれを試すことができます。
さらに、コマンド名を区別しない場合は、代わりに各ボタンのClickイベントを使用してみませんか?リピーターのItemCreatedまたはItemDataBoundにあるものをサブスクライブするだけです。
これを試して:
protected void Page_Load(object sender, EventArgs e)
{
SetupPage();
}
ネストされたリピーターを使用する場合は、内部のリピーターを再バインドする必要があります
コードビハインドで使用する必要のあるコードは次のとおりです。
pageLoadイベントの後、
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Page_LoadComplete(object sender, EventArgs e)
{
// Bind Your Repeater here
rptUser();
}
これで、Itemcommandを起動できます。出力を取得した場合は、回答に正しい感謝のマークを付けてください。
Page_loadの代わりにPage_initを使用してみてください。これで、問題が解決するはずです。