Nieprawidłowy argument wywołania zwrotnego lub wywołania zwrotnego. Sprawdzanie poprawności zdarzeń jest włączane za pomocą „<pages enableEventValidation =„ true ”/>”


238

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

Nie wykonuj wiązania danych w zdarzeniu page_load.
Paul Zahra,

Odpowiedzi:


171

Problem polega na tym, że ASP.NET nie dowiaduje się o tym dodatkowym lub usuniętym liście. Masz wiele opcji (wymienionych poniżej):

  • Wyłącz sprawdzanie poprawności zdarzeń (zły pomysł, ponieważ tracisz trochę bezpieczeństwa, które wiąże się z bardzo niewielkimi kosztami).
  • Użyj ASP.NET Ajax UpdatePanel. (Umieść pole listy w panelu aktualizacji i uruchom aktualizację, jeśli dodasz lub usuniesz pole listy. W ten sposób stan widoku i powiązane pola otrzymają aktualizacje i nastąpi zatwierdzenie zdarzenia).
  • Zapomnij o kliencie i użyj klasycznego postbacka i dodaj lub usuń listy elementów po stronie serwera.

Mam nadzieję, że to pomoże.


Jeszcze jedna opcja: zaimplementuj IPostBackEventHandler i wywołaj js __doPostBack ('<% = UniqueId.ToString ()%>', arg)
gdbdable

W oparciu o powyższe sugestie, umieszczam moje listy rozwijane w zwykłym ASP: NET AspP: UpdatePanel, załadowałem listy rozwijane w kodzie za, a następnie upNewRecord.Update ();
Ricardo Appleton,

183

Czy masz kody w swoich zdarzeniach Page_Load? jeśli tak, to może dodając następujące informacje, pomogą.

if (!Page.IsPostBack)
{ //do something }

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


7
aha! Dziękuję bardzo, to była sztuczka w moim przypadku! Ponownie załadowałem listę rozwijaną w ładowaniu strony, więc struktura utraciła kontrolę nad elementami (nowymi) w ddl, i tą, którą kliknąłem (która już nie istniała)
Michel

Miałem ten sam błąd co OP ... Korzystałem z kreatora w formularzu i dzwoniłem do kroku 0 podczas ładowania strony. usunąłem to i problem zniknął. Dzięki ...
Tobie

Bardzo dziękuję za tę odpowiedź ... Miałem ten sam problem i okazało się, że zapomniałem zignorować informacje zwrotne podczas ładowania danych do mojej sieci ... zaoszczędź mi dużo czasu
Quagmire

10
Hه! Powrót do formularzy internetowych z MVC jest uciążliwy. To poprawna odpowiedź
Vishnoo Rath,

2
Zrobiłem to, ale nie działało to dla mnie, ponieważ istnieje kod, który muszę uruchomić w zdarzeniu page_load, gdy nie jest to zwrotny, a więc nadal mam ten sam błąd. Zamiast tego wyłączenie widoku dla mojego repeatera rozwiązało problem.
Bryan

40

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:

„Nieprawidłowy argument wywołania zwrotnego lub wywołania zwrotnego. Sprawdzanie zdarzenia jest włączane przy użyciu w konfiguracji lub <% @ Page EnableEventValidation =" true "%> na stronie. Ze względów bezpieczeństwa ta funkcja sprawdza, czy argumenty zdarzeń wywołania zwrotnego lub wywołania zwrotnego pochodzą z kontrolki serwera, która pierwotnie je wyrenderował. Jeśli dane są prawidłowe i oczekiwane, użyj metody ClientScriptManager.RegisterForEventValidation w celu zarejestrowania danych zwrotnych lub zwrotnych w celu weryfikacji. ”

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.RegisterForEventValidationmetodę renderowania. Ale to nie zadziałało.

protected override void Render(HtmlTextWriter writer)
{
    foreach (DataGridItem item in this.Grid.Items)
    {
        Page.ClientScript.RegisterForEventValidation(item.UniqueID);
        foreach (TableCell cell in (item as TableRow).Cells)
        {
            Page.ClientScript.RegisterForEventValidation(cell.UniqueID);
            foreach (System.Web.UI.Control control in cell.Controls)
            {
                if (control is Button)
                    Page.ClientScript.RegisterForEventValidation(control.UniqueID);
            }
        }
    }
}

3) Zmieniłem typ przycisku w kolumnie siatki z PushButtonna LinkButton. 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.


1
Moim rozwiązaniem było zrezygnowanie z przycisków zagnieżdżania w siatce danych. MS znów mnie zawodzi.
Jacobs Data Solutions

Twoje rozwiązanie również dla mnie działa. Dziękuję Ci. Ale chcę wiedzieć, dlaczego Buttonnie działa, gdy linkButtonpracuje w tym samym programie. Jeśli tak, czy zawsze powinniśmy używać linkButton? Jak możemy uczynić bardziej elastycznym?
Frank Myat Czw

8
Spróbuj dodać do swojego przycisku UseSubmitBehavior = "False" stackoverflow.com/questions/2968525/...
JJschk

Awesomeeeeeee :) .. Możesz się tego nauczyć tylko przez doświadczenie .. Udowodniłeś prawdziwe sceniczne pokazy tatów Doświadczenie jest najlepszym nauczycielem .. Świetne odpowiedzi i wyjaśnienia!
saun4frsh

W zastąpieniu dla opcji Renderuj MUSISZ WŁĄCZYĆ base.Render (pisarz); na koniec ... inaczej to nie zadziała!
Paul Zahra,

28

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.


3
c, nie musisz trzymać wybranych elementów w ukrytym polu, jeśli wybierzesz opcję runat = "server", możesz odczytać przesłaną wartość z Request.Form [ selectid .UnqiueID]. A jeśli zaznaczonych jest wiele, przeglądarka publikuje wartości jako csv. Pamiętaj, że elementy i właściwości selectedindex formantu będą niepoprawne na serwerze, ponieważ zmodyfikowałeś itrmlist na kliencie, o którym serwer nie wie.
Michael

Michael, to zadziałało. pod warunkiem, że dodasz „wielokrotność = prawda”, w przeciwnym razie otrzymasz tylko 1 wartość. Dzięki
Sameer Alibhai,

1
Ten sam problem dotyczy listy rozwijanej ze znakami nowej linii. Zmiana na wybraną działała idealnie. Dzięki!
thchaver

Użyłem zwykłego starego <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.?
Pranesh Janarthanan

17

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.


3
Miałem właśnie ten problem ze starszą kontrolą sieci. Nasza platforma internetowa / CMS (sitecore) otrzymała dużą aktualizację, która włączyła sprawdzanie poprawności zdarzeń (wcześniej była wyłączona! Ojej!). Kontrolka repeatera wyświetlała obrazy w galerii internetowej (z przyciskami do ich zmiany), a po odłożeniu tych przycisków wystąpiłby wyjątek. Wyłączyłem stan widoku na przemiennikach za pomocą EnableViewState = "false", jak zasugerowałeś i hej, presto to zadziałało. Jak zauważyli inni, przesłonięcie Render () i użycie ClientScriptManager.RegisterForEventValidation () nie działało dla mnie. DZIĘKUJĘ CI!
xan

Podobnie jak @xan, również używam Sitecore i właśnie tego potrzebowałem.
wilsjd

To również działało dla mnie. Panel AJAX Update również by działał, ale był nadęty, czego nie potrzebowałem w tej sprawie, więc dziękuję Umar Farooq Khawaja.
Bryan

17

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

<body>
<form id="form1" runat="server">
<div>
        <form action="#" method="post" class="form" role="form">
        <div>
        ...
        <asp:Button ID="submitButton" runat="server"
        </div>
</div>
</body>

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.


12

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:

protected override void Render(HtmlTextWriter writer)
{
    foreach (string val in allPossibleListBoxValues)
    {
        Page.ClientScript.RegisterForEventValidation(myListBox.UniqueID, val);
    }
    base.Render(writer);
}

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:

protected override void Render(HtmlTextWriter writer)
{
    foreach (ListItem i in listBoxAll.Items)
    {
        Page.ClientScript.RegisterForEventValidation(listBoxSelected.UniqueID, i.Value);
    }
    base.Render(writer);
}

9

Innym niewymienionym tutaj sposobem jest podklasę ListBox

To znaczy.

public class ListBoxNoEventValidation : ListBox 
{
}

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


2
Ładnie opisane tutaj .
Pavel Hodek

1
Myślę, że najlepszym sposobem na rozwiązanie tego problemu jest zrobienie tego. Powinniśmy to naprawić na poziomie kontroli, a nie na poziomie strony i ryzykować bezpieczeństwo wszystkich kontroli +1 i dziękuję za @PavelHodek za ten link.
James Poulose

Niestety wydaje się, że jeśli to zrobisz, żadne elementy listy dodane do klienta nie zostaną rozpoznane, jeśli zostaną one wybrane, gdy strona zostanie ponownie wysłana.
Jonathan Wood

9

próbujesz czegoś takiego na stronie .aspx

Dodaj

EnableEventValidation = "false"

możesz zadać dowolne pytanie!


Argumentowałbym, czy wyłączenie oferty sprawdzania poprawności wbudowanej przez środowisko, aby przestać widzieć błąd, byłoby najlepszym rozwiązaniem w tym przypadku.
Jviaches

8

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


+1 Łatwe do wdrożenia. Może nie być najczystszy, ale dość łatwy.
nutsch

7

3: Zmieniłem typ przycisku w kolumnie siatki z „PushButton” na „LinkButton”. 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.

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.


Istotą tego problemu jest model walidacji zdarzeń asp.net i to, czy „strona” jest modyfikowana przez klienta w momencie, gdy wysyłasz post. Co masz na myśli „..... A te zmiany biegów powodują, że .net jest niespokojny” ??
Julius A

7

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

protected override void OnInit(EventArgs e) {
  foreach (GridViewRow grdRw in gvEvent.Rows) {

  Button deleteButton = (Button)grdRw.Cells[2].Controls[1];

  deleteButton.ID = "btnDelete_" + grdRw.RowIndex.ToString();           
  }
}

Oryginalny artykuł:

http://www.c-sharpcorner.com/Forums/Thread/35301/


6

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

<asp:TemplateField ItemStyle-Width="9">
  <ItemTemplate>
 <asp:ImageButton ID="ImgBtn" ImageUrl="Include/images/gridplus.gif" CommandName="Expand"
                        runat="server" />
  </ItemTemplate>
</asp:TemplateField>

Tak zastąpiłem.

<asp:TemplateField>
<ItemTemplate>
     <asp:LinkButton  CommandName="Expand" ID="lnkBtn"  runat="server" ><asp:Image  ID="Img"  runat="server" ImageUrl="~/Images/app/plus.gif" /></asp:LinkButton>
      </ItemTemplate>
</asp:TemplateField> 

5

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:

DropDownList DD = (DropDownList)F.FindControl("DDlista");
HiddenField HF = (HiddenField)F.FindControl("HFlista");
string[] opcoes = HF.value.Split('\n');
foreach (string opcao in opcoes) DD.Items.Add(opcao);

Moje „HF” (ukryte pole) miało opcje oddzielone znakiem nowej linii, takie jak to:

HF.value = "option 1\n\roption 2\n\roption 3";

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

DropDownList DD = (DropDownList)F.FindControl("DDlista");
HiddenField HF = (HiddenField)F.FindControl("HFlista");
string dados = HF.Value.Replace("\r", "");
string[] opcoes = dados.Split('\n');
foreach (string opcao in opcoes) DD.Items.Add(opcao);

Mam nadzieję, że komuś to pomoże.


4

jeśli zmienisz UseSubmitBehavior="True" na UseSubmitBehavior="False"swój problem zostanie rozwiązany

<asp:Button ID="BtnDis" runat="server" CommandName="BtnDis" CommandArgument='<%#Eval("Id")%>' Text="Discription" CausesValidation="True" UseSubmitBehavior="False" />

To nie działało dla mnie. Używam jednak przycisku obrazu i w tabeli w repeaterze, więc nie jest to dokładnie ta sama sytuacja. Wyłączenie stanu podglądu przemiennika działało dla mnie.
Bryan

3

Miałem ten sam problem, co zrobiłem:

Właśnie dodałem warunek if(!IsPostBack)i działa dobrze :)



2

W takim przypadku dodaj identyfikator do przycisku w RowDataBound siatki. Rozwiąże twój problem.


2

Prostym rozwiązaniem tego problemu jest użycie kontroli IsPostBack przy ładowaniu strony. To rozwiąże ten problem.


2

Ajax UpdatePanel sprawia, że ​​jest to, i myślę, że jest to najłatwiejszy sposób, ignorując obciążenie zwrotne po Ajaxie .


2

Wiem, że to bardzo stary post. Zakładając, że dzwonisz do swojej aplikacji, oto pomysł, który zadziałał dla mnie:

  1. Zaimplementuj ICallbackEventHandler na swojej stronie
  2. Wywołaj ClientScriptManager.GetCallbackEventReference, aby wywołać kod po stronie serwera
  3. Zgodnie z komunikatem o błędzie można następnie wywołać ClientScriptManager.RegisterForEventValidation

Jeśli nie potrzebujesz pełnej kontroli, możesz użyć panelu aktualizacji, który zrobiłby to za Ciebie.


2

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.


Dzięki, okazuje się, że miałem również dodatkowe <form>pola w kodzie.
Eric Kigathi,

2

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.

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

1

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!


1

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


1

Dla mnie zadziałało przeniesienie następującego kodu z page_load do page_prerender:

lstMain.DataBind();
Image img = (Image)lstMain.Items[0].FindControl("imgMain");

// Define the name and type of the client scripts on the page.
String csname1 = "PopupScript";
Type cstype = this.GetType();

// Get a ClientScriptManager reference from the Page class.
ClientScriptManager cs = Page.ClientScript;

// Check to see if the startup script is already registered.
if (!cs.IsStartupScriptRegistered(cstype, csname1))
{
    cs.RegisterStartupScript(cstype, csname1, "<script language=javascript> p=\"" + img.ClientID + "\"</script>");
}

1

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


Zmiana z kontroli asp na zwykłe <select id = "director" runat = "server"> działała świetnie. Udało mi się uzyskać dostęp do jego wartości w kodzie za pomocą: np .: string DirectorId = Request.Form [Director.ID]
Baxter

1

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


1

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:

Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)

    Dim ClientScript As ClientScriptManager = Page.ClientScript

    ClientScript.RegisterForEventValidation("ddCar", "Mercedes")

    MyBase.Render(writer)
End Sub

lub niewielka zmiana w C # może być:

protected override void Render(HtmlTextWriter writer)
{
    Page.ClientScript.RegisterForEventValidation("ddCar", "Mercedes");
    base.Render(writer);
}

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.


1

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.