Podczas publikowania strony po stronie klienta pojawia się następujący błąd. Mam kod JavaScript, który modyfikuje asp: ListBox po stronie klienta.
Jak to naprawić?
Szczegóły błędu poniżej:
Server Error in '/XXX' Application.
--------------------------------------------------------------------------------
Invalid postback or callback argument. Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page. For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them. If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.ArgumentException: Invalid postback or callback argument. Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page. For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them. If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.
Source Error:
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.
Stack Trace:
[ArgumentException: Invalid postback or callback argument. Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page. For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them. If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.]
System.Web.UI.ClientScriptManager.ValidateEvent(String uniqueId, String argument) +2132728
System.Web.UI.Control.ValidateEvent(String uniqueID, String eventArgument) +108
System.Web.UI.WebControls.ListBox.LoadPostData(String postDataKey, NameValueCollection postCollection) +274
System.Web.UI.WebControls.ListBox.System.Web.UI.IPostBackDataHandler.LoadPostData(String postDataKey, NameValueCollection postCollection) +11
System.Web.UI.Page.ProcessPostData(NameValueCollection postData, Boolean fBeforeLoad) +353
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1194
--------------------------------------------------------------------------------
Version Information: Microsoft .NET Framework Version:2.0.50727.1433; ASP.NET Version:2.0.50727.1433
Odpowiedzi:
Problem polega na tym, że ASP.NET nie dowiaduje się o tym dodatkowym lub usuniętym liście. Masz wiele opcji (wymienionych poniżej):
Mam nadzieję, że to pomoże.
źródło
Czy masz kody w swoich zdarzeniach Page_Load? jeśli tak, to może dodając następujące informacje, pomogą.
Ten błąd jest zgłaszany po kliknięciu polecenia i ponownym uruchomieniu Page_load, w normalnym cyklu życia będzie Page_Load -> Kliknij Command -> Page_Load (ponownie) -> Przetwarzaj zdarzenie ItemCommand
źródło
Miałem doświadczenie z DataGrid. Jedną z jego kolumn był przycisk „Wybierz”. Kiedy kliknąłem przycisk „Wybierz” dowolnego wiersza, otrzymałem ten komunikat o błędzie:
Zmieniłem kilka kodów i wreszcie mi się udało. Moja trasa doświadczenia:
1) Zmieniłem atrybut strony na
EnableEventValidation="false"
. Ale to nie zadziałało. (nie tylko jest to niebezpieczne ze względów bezpieczeństwa, moja obsługa zdarzeń nie została wywołana:void Grid_SelectedIndexChanged(object sender, EventArgs e)
2) Zaimplementowałem
ClientScript.RegisterForEventValidation
metodę renderowania. Ale to nie zadziałało.3) Zmieniłem typ przycisku w kolumnie siatki z
PushButton
naLinkButton
. Zadziałało! („ButtonType =„ LinkButton ”). Myślę, że jeśli możesz zmienić swój przycisk na inne elementy sterujące, takie jak„ LinkButton ”w innych przypadkach, działałoby to poprawnie.źródło
Button
nie działa, gdylinkButton
pracuje w tym samym programie. Jeśli tak, czy zawsze powinniśmy używaćlinkButton
? Jak możemy uczynić bardziej elastycznym?Naprawdę będziesz chciał zrobić 2 lub 3, nie wyłączaj sprawdzania poprawności zdarzeń.
Istnieją dwa główne problemy z dodawaniem elementów do strony asp: listbox po stronie klienta.
Po pierwsze, zakłóca to sprawdzanie poprawności zdarzeń. To, co wróciło na serwer, nie jest tym, co wysłał.
Po drugie, nawet jeśli wyłączysz sprawdzanie zdarzeń, po ponownym opublikowaniu strony elementy w polu listy zostaną odbudowane ze stanu wyświetlania, więc wszelkie zmiany dokonane na kliencie zostaną utracone. Powodem tego jest to, że asp.net nie oczekuje, że zawartość pola listy zostanie zmodyfikowana na kliencie, oczekuje jedynie dokonania wyboru, więc odrzuca wszelkie zmiany, które mogłeś wprowadzić.
Najlepszą opcją jest najprawdopodobniej użycie panelu aktualizacji zgodnie z zaleceniami. Inną opcją, jeśli naprawdę musisz zrobić to po stronie klienta, jest użycie zwykłego starego
<select>
zamiast an<asp:ListBox>
i utrzymanie listy elementów w ukrytym polu. Gdy strona renderuje się na kliencie, możesz wypełnić ją przez podział zawartości pola tekstowego.Następnie, gdy jesteś gotowy do opublikowania, ponownie wypełniasz zawartość ukrytego pola od zmodyfikowanego
<select>
. Następnie, oczywiście, musisz podzielić to ponownie na serwerze i zrobić coś ze swoimi przedmiotami, ponieważ twój wybór jest pusty teraz, gdy jest z powrotem na serwerze.Podsumowując, jest to dość kłopotliwe rozwiązanie, którego tak naprawdę nie poleciłbym, ale jeśli naprawdę musisz dokonać modyfikacji listBox po stronie klienta, to działa. Jednak naprawdę polecam zajrzenie do updatePanel przed wybraniem tej trasy.
źródło
<select>
, który rozwiązał problem. Czy możesz mi powiedzieć, dlaczego Updatepanel zajmuje dużo czasu, aby załadować dane w porównaniu do ładowania danych po stronie klienta ajax.?Miałem ten sam problem z repeaterem, ponieważ miałem stronę internetową z kontrolką Repeater na stronie internetowej, na której włączono EnableEventValidation. To nie było dobre. Otrzymywałem nieprawidłowe wyjątki związane z odsyłaniem zwrotnym.
Dla mnie zadziałało ustawienie EnableViewState = "false" dla repeatera. Zaletą jest to, że jest prostszy w użyciu, tak prosty jak wyłączenie sprawdzania zdarzeń dla strony internetowej lub strony internetowej, ale zakres jest o wiele mniejszy niż wyłączenie sprawdzania zdarzeń dla obu stron.
źródło
Żadne z powyższych nie działało dla mnie. Po dalszych kopaniach zdałem sobie sprawę, że przeoczyłem 2 formularze zastosowane na stronie, co było przyczyną problemu.
Należy pamiętać, że ostatnio ASP.NET zaczął rozważać stosowanie ramek iframe w znaczniku formy, który zawiera znacznik formy w samym dokumencie iframe jako zagnieżdżoną ramkę. Musiałem przenieść iframe z tagu formularza, aby uniknąć tego błędu.
źródło
Miałem ten sam problem podczas modyfikowania ListBox za pomocą JavaScript na kliencie. Występuje, gdy dodajesz nowe elementy do ListBox od klienta, których nie było podczas renderowania strony.
Znaleziona przeze mnie poprawka polega na informowaniu systemu weryfikacji zdarzeń o wszystkich możliwych prawidłowych elementach, które można dodać od klienta. Robisz to, zastępując Page.Render i wywołując Page.ClientScript.RegisterForEventValidation dla każdej wartości, którą JavaScript może dodać do pola listy:
Może to być trochę uciążliwe, jeśli masz dużą liczbę potencjalnie prawidłowych wartości dla pola listy. W moim przypadku przenosiłem elementy między dwoma ListBoxami - jednym, który ma wszystkie możliwe wartości, i drugim, który początkowo jest pusty, ale zostaje wypełniony podzbiorem wartości z pierwszego w JavaScript, gdy użytkownik kliknie przycisk. W takim przypadku wystarczy powtórzyć elementy z pierwszego ListBox i zarejestrować każdy z drugim polem listy:
źródło
Innym niewymienionym tutaj sposobem jest podklasę ListBox
To znaczy.
ClientEventValidation wyłącza atrybut System.Web.UI.SupportsEventValidation, jeśli podklasujesz, chyba że dodasz go ponownie, nigdy nie wywoła procedury sprawdzania poprawności. Działa to z dowolną kontrolą i jest to jedyny sposób, w jaki udało mi się „wyłączyć” kontrolę na podstawie kontroli (tj. Nie na poziomie strony).
źródło
próbujesz czegoś takiego na stronie .aspx
Dodaj
możesz zadać dowolne pytanie!
źródło
Jeśli wypełnisz DropdownList za pomocą skryptu po stronie klienta, wyczyść listę przed przesłaniem formularza z powrotem na serwer; wtedy ASP.NET nie będzie narzekać, a zabezpieczenia będą nadal włączone.
Aby pobrać dane z DDL, możesz dołączyć zdarzenie „OnChange” do DDL, aby zebrać wartość w ukrytym danych wejściowych lub w polu tekstowym za pomocą Style = „display: none;”
źródło
Chciałbym móc zagłosować za tobą, Amir (niestety mój przedstawiciel jest zbyt niski.) Właśnie miałem ten problem i zmieniłem to, działając jak mistrz w moim widoku siatki. Tylko trochę na bok, myślę, że poprawny kod to: ButtonType = "Link"
Podejrzewam, że dzieje się tak, ponieważ po kliknięciu przycisku „edytuj” zmiana zmienia się na „aktualizuj” i „anuluj”, a następnie przy przesyłaniu ponownie zmienia się na „edytuj”. A te zmiany biegów sprawiają, że .net jest niespokojny.
źródło
(1) EnableEventValidation = "false" ................... To nie działa dla mnie.
(2) ClientScript.RegisterForEventValidation .... To nie działa dla mnie.
Rozwiązanie 1:
Zmień Button / ImageButton na LinkButton w GridView. To działa. (Ale lubię ImageButton)
Badanie: Button / ImageButton i LinkButton używają różnych metod do wysyłania zwrotnego
Oryginalny artykuł:
http://geekswithblogs.net/mahesh/archive/2006/06/27/83264.aspx
Rozwiązanie 2:
W OnInit () wprowadź kod podobny do tego, aby ustawić unikalny identyfikator dla Button / ImageButton:
Oryginalny artykuł:
http://www.c-sharpcorner.com/Forums/Thread/35301/
źródło
Zaimplementowałem zagnieżdżony widok siatki i napotkałem ten sam problem. Użyłem LinkButton zamiast przycisku obrazu w następujący sposób:
zanim miałem taką kolumnę:
Tak zastąpiłem.
źródło
Miałem podobny problem, ale nie używałem ASP.Net 1.1 ani nie aktualizowałem formantu za pomocą javascript. Mój problem wystąpił tylko w przeglądarce Firefox, a nie w przeglądarce IE (!).
Dodałem opcje do DropDownList na zdarzeniu PreRender w następujący sposób:
Moje „HF” (ukryte pole) miało opcje oddzielone znakiem nowej linii, takie jak to:
Problem polegał na tym, że strona HTML była uszkodzona (mam na myśli nowe linie) w opcjach „select”, które reprezentowały DropDown.
Rozwiązałem więc mój problem, dodając jedną linię:
Mam nadzieję, że komuś to pomoże.
źródło
jeśli zmienisz
UseSubmitBehavior="True"
naUseSubmitBehavior="False"
swój problem zostanie rozwiązanyźródło
Miałem ten sam problem, co zrobiłem:
Właśnie dodałem warunek
if(!IsPostBack)
i działa dobrze :)źródło
Ten błąd pojawi się bez postback
Dodaj kod:
źródło
W takim przypadku dodaj identyfikator do przycisku w RowDataBound siatki. Rozwiąże twój problem.
źródło
Prostym rozwiązaniem tego problemu jest użycie kontroli IsPostBack przy ładowaniu strony. To rozwiąże ten problem.
źródło
Ajax UpdatePanel sprawia, że jest to, i myślę, że jest to najłatwiejszy sposób, ignorując obciążenie zwrotne po Ajaxie .
źródło
Wiem, że to bardzo stary post. Zakładając, że dzwonisz do swojej aplikacji, oto pomysł, który zadziałał dla mnie:
Jeśli nie potrzebujesz pełnej kontroli, możesz użyć panelu aktualizacji, który zrobiłby to za Ciebie.
źródło
Ten sam problem napotkaliśmy podczas konwersji naszych zwykłych stron ASPX na strony z treścią.
Strona z tym problemem miała
</form>
znacznik w jednej z sekcji Treść, dlatego w czasie wykonywania renderowane były dwa znaczniki końcowe formularza, co spowodowało ten problem. Usunięcie dodatkowego tagu końcowego formularza ze strony rozwiązało ten problem.źródło
<form>
pola w kodzie.Jeśli używasz gridview i nie wiążesz gridview podczas pageload wewnątrz! Ispostback, ten błąd występuje, gdy klikniesz edycję i usuniesz wiersz w gridview.
źródło
Cztery minuty temu otrzymałem ten sam błąd. Potem badałem przez pół godziny jak ty. Na wszystkich forach zazwyczaj mówią „dodaj stronę enableEvent .. = false lub true”. Żadne zaproponowane rozwiązanie nie rozwiązało moich problemów, dopóki go nie znalazłem. Problemem jest niestety przycisk ASP.NET. Usunąłem to dwie sekundy temu. Próbowałem zastąpić „imagebutton”, ale było to również niedopuszczalne (ponieważ dawało ten sam błąd).
W końcu zastąpiłem
LinkButton
. Wygląda na to że działa!źródło
Korzystałem z danych i otrzymałem ten sam błąd dla mojego przycisku. Po prostu używam IsPostBack, aby sprawdzić i wypełnić moje elementy sterujące, a problem został rozwiązany! Wspaniały!!!
źródło
Dla mnie zadziałało przeniesienie następującego kodu z page_load do page_prerender:
źródło
Najlepszą opcją jest użycie ukrytego pola i nie wyłączanie sprawdzania poprawności zdarzeń, zmiana każdego pola listy, lista rozwijana do wyboru z atrybutem serwera runat
źródło
Jeśli korzystasz z panelu aktualizacji Ajax. Dodaj
<Triggers>
tag, a wewnątrz niego uruchom przycisk lub kontrolkę powodującą użycie postBack<asp:PostBackTrigger .../>
źródło
Jeśli znasz dane, które można wypełnić, możesz użyć ClientScriptManager, aby rozwiązać ten problem. Miałem ten problem, gdy dynamicznie wypełniałem menu rozwijane za pomocą javascript przy poprzednim wyborze użytkownika.
Oto przykładowy kod zastępujący metodę renderowania (w VB i C #) i deklarujący potencjalną wartość listy rozwijanej ddCar.
W VB:
lub niewielka zmiana w C # może być:
Dla początkujących: powinien znajdować się w kodzie za plikiem (.vb lub .cs) lub, jeśli jest używany w pliku aspx, możesz zawijać
<script>
znaczniki.źródło
To był powód, dla którego go otrzymałem:
Miałem ASP: ListBox. Początkowo był ukryty. Po stronie klienta wypełniłbym go za pomocą AJAX opcjami. Użytkownik wybrał jedną opcję. Następnie po kliknięciu przycisku Prześlij, serwer będzie się zabawnie bawić z ListBox, ponieważ nie pamięta, że ma jakieś opcje.
Więc upewniłem się, że wyczyściłem wszystkie opcje listy przed przesłaniem formularza z powrotem na serwer. W ten sposób serwer nie narzekał, ponieważ lista trafiła do klienta pusta i wróciła pusta.
Posortowane !!!
źródło