2009-08-24 12 views
18

OK, ich habe Repeater buchstäblich Hunderte von Malen ohne Probleme verwendet, aber etwas ist heute schief gegangen. Ich habe einen Repeater und abonniere das Ereignis itemCommand, aber wenn mein Befehl ausgeführt wird, sendet die Seite einen Post, aber das Ereignis wird nicht ausgelöst.ASP.Net Repeater Element Befehl wird nicht ausgelöst

Um dies zu umgehen, muss ich meine Datenbindung für jeden Postback machen.

Mein Repeater sieht wie folgt aus:

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

und mein Code-Behind wie folgt aus:

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 
} 

MyRepeater_ItemCommand nicht aufgerufen zu werden, wenn ich den Kommentar, wenn Linie (IsPostBack!). Sobald das auskommentiert ist und der Repeater bei jedem Postback datengebunden wird, funktioniert es OK. Ich habe das auf so vielen anderen Seiten gemacht, aber auf diesem scheint es einfach nicht zu funktionieren.

Wer ist sonst auf dieses Verhalten gestoßen oder hat eine Lösung?

+0

Zeigen Sie uns den vollständigen Code Ihrer Seite (Markup & Backend) wenn möglich. – Bdiem

+0

Vollständiges Markup passt nicht in das Kommentarfeld, aber auf der Seite ist nichts Ungewöhnliches. Verwenden von Masterseiten (keine Referenz zum Deaktivieren von ViewState in Masterseiten) und Inhaltsplatzhaltern und dann ein Repeater - sehr einfach. Code hinter hat einige weitere Datenbank/Repository-Zugriffscode aber wieder nichts Ungewöhnliches –

+0

Haben Sie ViewState für diese Seite aktiviert? –

Antwort

22

Höchstwahrscheinlich haben Sie ViewState für die Seite deaktiviert.

Der Grund ist, dass beim Ausführen des Postbacks alle Steuerelemente im Repeater aus den Daten im Viewstate normal neu erstellt werden. Dann wird das Objekt, das das Ereignis empfangen soll, basierend auf der ID des Steuerelements identifiziert und das Ereignis wird geroutet.

Wenn Sie den Viewstatus deaktivieren, wird die Steuerelementstruktur während des Postbacks nicht neu erstellt, und daher ist das Steuerelement, das das Ereignis empfangen soll, nicht im Speicher vorhanden. Also stirbt das Ereignis.

Wenn Sie den Viewstatus wirklich deaktivieren möchten, aber trotzdem das Ereignis erhalten möchten, habe ich eine Workaround (und es ist überhaupt nicht schmutzig). Ich habe lange darüber nachgedacht, einen Blogeintrag darüber zu schreiben, also kann ich, wenn du willst, ein bisschen Freizeit von meinen normalen Aufgaben nehmen und sie beschreiben.

Edit: Die Abhilfe ist hier beschrieben: http://petesdotnet.blogspot.dk/2009/08/asp.html

+0

+1, in der Vergangenheit hatte ich das gleiche Problem mit Viewstate. (Ich würde gerne Ihre Arbeitsumgebung kennen) – Cleiton

+0

+1 das macht viel mehr Sinn. vielleicht fügen Sie das zu Ihrer Antwort hinzu. http://msdn.microsoft.com/en-us/library/ms972976.aspx – Bdiem

+0

Nein, ViewState ist aktiviert (ich habe es nirgends in der Anwendung deaktiviert) –

0

ich darüber nicht positiv bin, aber Sie könnten die Command und optional Command Eigenschaften für die Schaltfläche bewirkt die ItemCommand Ereignis eingestellt haben. Andernfalls würde ASP.NET annehmen, dass auf der Seite, auf der Sie das Ereignis auslösen möchten, keine Schaltfläche vorhanden ist. Du kannst es versuchen.

Plus, wenn Sie nicht zwischen Befehlsnamen unterscheiden, warum nicht stattdessen Click-Ereignis jeder Schaltfläche verwenden? Abonnieren Sie einfach die ItemCreated oder ItemDataBound des Repeaters.

+0

Wie Sie aus dem obigen Code sehen können, habe ich einen CommandName und ein CommandArgument angegeben. Ich habe bereits eine Arbeit dafür durch Datenbindung auf jedem Postback - aber ich will das nicht zu tun haben –

0

Versuchen Sie es mit Pageinit anstelle von Pageload und das sollte das Problem beheben.

+0

Nicht wirklich. Im Init-Ereignis "Wenn es sich bei der aktuellen Anfrage um ein Postback handelt, wurden die Postback-Daten noch nicht geladen und die Steuereigenschaftswerte wurden nicht aus dem Ansichtszustand in die Werte zurückgeschrieben." Siehe: http://msdn.microsoft.com/en-us/library/ms178472.aspx – Venemo

0

Hier ist die Lösung für Stack Overflow: link. Hoffe, das hilft!

EDIT: Ich bemerkte, dass Ihr Repeater das ItemCommand-Ereignis von Markup abonniert. Wenn ich es so mache, feuert es auch nicht für mich!

Ich muss auch darauf hinweisen, dass das Ereignis nur funktioniert, nachdem der Repeater Daten gebunden wurde.Versuchen Sie also, das Ereignis im Code und nach dem Aufrufen der DataBind() -Methode zu abonnieren.

+0

Wie Sie aus meinem ursprünglichen Code oben sehen können, habe ich bereits das ItemCommand-Ereignis mit einem CommandArgument und einem CommandName –

+0

Ich aktualisierte meine Antwort um klarzustellen. :) – Venemo

6

Entfernen Sie if (!IsPostBack), da dies das erneute Binden des Repeaters verhindert, und das Elementbefehlsereignis die Zeile nach dem Postback nicht finden konnte.

1

Ich habe dieses Problem in einem Repeater, wenn ich Image verwenden ... Ich suche habe das Netz für diese Lösung, wenn Linkbutton Arbeit, aber nicht ... Image

Dann denke ich, Linkbutton arbeiten? so werde ich es verwenden :)

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

</asp:LinkButton> 

So ist das Bild innerhalb des <A> Tag

haben Spaß :)

1

I entfernt PostBackUrl Eigenschaft in Linkbutton und ItemCommand gebrannt. Ich denke Postback läuft zuerst.

0

Überprüfen Sie die Befehlsnamenbindung.

+0

Willkommen bei Stack Overflow. Das ist keine gute Antwort. Siehe [Wie schreibe ich eine gute Antwort auf eine Frage?] (Http://meta.stackexchange.com/questions/7656/how-do-i-write-a-good-answer-to-a-question) – hims056

0

Try this:

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

Wenn Sie verschachtelte-Repeater verwenden, sollten Sie Ihren inneren repe

0

rebind Dass Sie Validierungen haben eingestellt werden können auf Ihrer Seite. Setzen Sie daher ein neues Attribut, causevaliation = "false", auf die Schaltfläche "Link". M sicher, dass es das Problem lösen wird

1

Ich hatte ein ähnliches Problem - stellte sich heraus, einige diskrete Validierungssteuerelemente wurden an anderer Stelle auf der Seite ausgelöst. Es dauerte nur einen Tag, um es herauszufinden ...

3

Ich habe das gleiche Problem und neben der Verwendung von Update-Panel, habe ich einen erforderlichen Feld-Validator in meinem Modal. Ich habe herausgefunden, dass die LinkButtons in meinem Repeater das mustedFieldValidor-Ereignis auslöst, und dann habe ich CausesValidation = "false" in die LinkButtons meines Repeaters eingefügt. Funktioniert wie erwartet.

+0

Genau das, was ich vermisste.thankx – mzonerz

0

ist hier der Code, den Sie hinter im Code verwenden ..

nach Pageload-Ereignis,

protected void Page_Load(object sender, EventArgs e) 
{ 

} 


protected void Page_LoadComplete(object sender, EventArgs e) 
{ 
     // Bind Your Repeater here 
     rptUser(); 
} 

jetzt können Sie Ihre Itemcommand..if Sie Output bitte Antwort als richtig Dank markieren erhalten Feuer

0

Eine andere Sache, die es könnte (wie es mir gerade passiert ist): wenn Ihre Datenbank findet, wenn Ihre Seite vorgerendered ist, wird es nicht den Gegenstand Befehl verarbeiten. Schalten Sie es auf Laden oder Init und alles wird gut.