Benutzer-Steuerelement-Ereignis-handler verloren postback
Ich habe ein menu usercontrol aufgerufen LeftMenu hat ein bulletedlist von linkitems. Es ist auf der ascx-Seite als solche:
<asp:BulletedList ID="PublisherList" DisplayMode="LinkButton" OnClick="PublisherList_Click" cssClass="Menu" runat="server"></asp:BulletedList>
Ich databind-Methode der Liste in der page_load-unter if(!isPostBack)
Ich habe ein Problem auf einer Seite, die Lasten der Kontrolle. Wenn die Seite das erste mal lädt, wird der event-handler feuert. Allerdings, wenn die Seite, die Beiträge zurück, die es nicht mehr feuert und im IE8, wenn ich Debuggen, bekomme ich "Microsoft JScript runtime error: Objekt erwartet" in Visual Studio den Hinweis an "__doPostBack('LeftMenu$PublisherList','0')." In FF habe ich nicht den Fehler, aber es passiert nichts. Ich bin nicht dem laden des Steuerelements dynamisch, es ist geladen, auf der aspx-Seite mit:
<%@ Register TagPrefix="Standards" TagName="LeftMenu" Src="LeftMenu.ascx" %>
<Standards:LeftMenu ID="LeftMenu" runat="server"/>
Irgendwelche Ideen, wo ich bin verlieren den event-handler?
Merkte ich, das passiert auf einem anderen Benutzer die Kontrolle habe ich als gut. Ein Textfeld und ein button, und ich bin mit der Schaltfläche Standard stellen Sie sicher, drücken Sie die enter-Taste verwendet, die Taste. .Net wandelt, dass in der html auf:
<div id="SearchBarInclude_SearchBar" onkeypress="javascript:return WebForm_FireDefaultButton(event, 'SearchBarInclude_QuickSearchButton')">
so, sobald ich einen Schlüssel eingeben, in das Feld bekomme ich einen javascript error in der Zeile mit dem Inhalt "Objekt erwartet." Es scheint, wie die beiden Fragen im Zusammenhang.
Edit Nochmal: ich glaube, ich brauche zu klären. Es ist nicht, dass ich das klicken auf den Menüpunkt und es nicht finden können Sie das gewählte Objekt auf postback. Ich habe diese such-Seite mit der linken navigation und der Hauptinhalt der Seite ist etwas, das ein postback verursacht. Alles in Ordnung mit dieser postback. Einmal, die Seite wurde zurück gebucht, jetzt wenn ich auf die Aufzählung in der linken navigation bekomme ich einen javascript-Fehler und es funktioniert nicht. Der page_init für die LeftMenu Steuerelement wird nie genannt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es klingt wie Sie möglicherweise zu verlieren, die klicken, weil Sie nicht DataBinding die Liste auf PostBack. Also, die post wieder versucht, verweisen auf ein Steuerelement (eine bestimmte Liste mit Aufzählungszeichen Element) existiert nicht.
Sollten Sie versuchen, die Bindung der Liste wieder auf PostBack nur um zu sehen, ob das behebt das Problem. ABER sollte das, was WIRKLICH geschehen ist, dass die LeftMenu und die BulletedList sollten Ihre Angaben speichern in ViewState, so dass Sie sicherstellen können, dass die Daten, die gezeigt wurde, um die Benutzer auf Ihren ersten laden der Seite ist die gleichen Daten, die PostBack-Verarbeitung und arbeiten mit.
Wenn Sie EnableViewState=true für Ihr UserControl-und alle Steuerelemente innerhalb der es, sollte alles gut funktionieren. Mit ViewState aktiviert, ASP reinflate Ihre Kontrollen von ViewState nach Init ausgelöst hat. Dies bedeutet, dass die postback-Ereignis arg (die Punkte auf einen index in der Liste) noch die Kontrolle in dieser Liste position. Ansonsten ist die Liste leer ist postback.
Jedoch ViewState ist das Werk des Teufels und war schlicht gestaltet, um zu fördern die illusion, dass Sie arbeiten in einer effektiven Umgebung. Es ist okay, es zu benutzen für kleine Mengen von Daten, aber in der Regel nicht ratsam, für vorgefertigte controls wie Repeater und-Listen, weil Sie keine Ahnung haben, wie viel Daten erzeugt werden, die in ViewState.
Wenn Sie sind den Umgang mit statischen oder relativ statische Daten, speichern Sie es in den Anwendungs-cache und binden Sie Ihre Listen in der Seite.Init jeder Zeit (beachten Sie, dass es in der Init-weil post-init ist, wenn ASP bindet von ViewState; wenn Sie sich dort zunächst Ihre Daten werden stattdessen verwendet).
Wenn Sie sind den Umgang mit flüchtigen Daten, haben Sie ein problem, weil die Daten, die Sie binden muss genau die gleiche wie die original-Seite anfordern, da sonst die postback-Ereignissen werden brennen gegen die falschen Zeilen. In diesem Fall müssen Sie entweder speichern Sie Ihre ersten Daten in der Session oder einfach nur speichern Sie die Liste der Zeilen-ids (in einer versteckten Variablen oder Session), und Sie erstellen Sie die Daten zu binden, gegen die von der ids jedes mal.
Eine noch bessere Lösung ist die Verwendung nicht-postback-Ereignisse überhaupt. Versuchen Sie zu drehen, alle Ihre Veranstaltungen in Bekommt, die haben eine ID über den query-string. Sie können weiterhin erstellen Sie die Liste mit Hilfe von verbindlichen ersten mal durch die Seite (wie Sie derzeit tut), und Sie können sogar die gleiche Seite mit einer neuen ID.
Wenn Sie brauchen, um zu halten, Stand auf der gleichen Seite aber reagieren müssen, um dem Benutzer das ändern eines radio-button-Auswahl (oder etwas anderes), denken über die Verwendung von Ajax-Aufrufe um den Bildschirm zu aktualisieren. Sie machen das auch mit einer ID, die Sie übergeben, um den Ajax-call.
Im Allgemeinen, je mehr Sie sich bewegen von mit stateful ASP, die leichter und stärker auf Ihre Seiten geworden. Sie werden auch in eine bessere position zu bewegen, um Staatenlosen MVC, wenn nötig. Sie sparen auch viel Zeit verloren, um das Debuggen zu verdecken Probleme, da ViewState ist nicht verfügbar, wenn Sie es brauchen.
Die besten Analyse der ViewState ich gelesen habe, ist im link unten. Wenn Sie verstehen, wie es funktioniert, können Sie es weiterhin verwenden, ohne notwendigerweise anfallenden Kosten.
http://weblogs.asp.net/infinitiesloop/archive/2006/08/03/truly-understanding-viewstate.aspx
Es ist möglich, dass dies vielleicht javascript im Zusammenhang, und dass ein Skript, das den laden früher in die Seite wirft einen Fehler, und verursacht die Seite nicht richtig geladen.
Sind Ihre Benutzersteuerelemente laden von javascript auf die Seite? Können Sie prüfen, ob javascript-Fehler auf das Initiale laden der Seite?
Zog ich den code in ein bestehendes Projekt, das wir haben und aus irgendeinem seltsamen Grund, ich hielt immer die javascript-Fehler und-stattdessen bekam:
"Ungültiges postback oder callback-argument. Ereignis-Validierung aktiviert ist, mithilfe
<pages enableEventValidation="true"/>
in der Konfiguration oder<%@ Page EnableEventValidation="true" %>
auf einer Seite.Sicherheitsgründen diese Funktion überprüft, ob Argumente zu postback oder callback-Ereignisse stammen aus dem server-Steuerelement, das ursprünglich gerendert Ihnen. Wenn die Daten gültig sind, und erwartet, verwenden Sie die
ClientScriptManager.RegisterForEventValidation
Methode, um zu registrieren, das postback oder callback-Daten für die Validierung."Ich habe nicht ganz herausgefunden, wo ich bin, soll das register Ereignis-Validierung mit einem Steuerelement, aber in der Zwischenzeit ich habe gerade
enableeventvalidation=false
und es scheint zu funktionieren jetzt.Sieht es aus wie die doPostBack-Funktion fehlt, da seine Argumente sind Literale, so dass Sie konnte nicht die Ursache sein. Ist, dass man eigene Funktionen oder meinten Sie zum aufrufen der ASP - __doPostBack-Funktion?
Haben Sie einen Blick auf die Firefox Fehler-Konsole oder script-debugging im IE und finden Sie genau das, was Objekt kann nicht gefunden werden. Besser noch, download Firebug und zu Debuggen.
Hatte ich ein ähnliches Problem. Es stellte sich heraus, dass Akamai war das ändern der user-agent-string, da eine Einstellung angewendet wird, die nicht notwendig war.
Dies bedeutete, dass einige .NET-Steuerelemente nicht Rendern __doPostBack code richtig. Dieses Problem wurde gebloggt hier.