2010-06-03 10 views
7

Ok, więc mam pole szablonu w GridView, który zawiera tylko prosty przycisk ...przycisk TemplateField powodując GridView Nieprawidłowy Postback

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Administration.aspx.cs"  
Inherits="Administration" %> 
<%@ Register TagPrefix="ajaxToolkit" Namespace="AjaxControlToolkit" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server">  
    <title>Keywords Administration</title> 
</head> 
<body class="popupbody"> 
<form id="form1" runat="server"> 
    <ajaxToolkit:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server" EnablePartialRendering="true" CombineScripts="false"></ajaxToolkit:ToolkitScriptManager> 

    <asp:Label ID="AddLabel" runat="server">Add a Keyword</asp:Label> 
    <br /> 
    <asp:TextBox ID="AddTextBox" runat="server" /> 
    <asp:Button ID="AddButton" Text="Add" runat="server" OnClick="AddKeyword_Click" /> 

    <asp:GridView ID="KeywordsGridView" AllowPaging="false" AutoGenerateColumns="false" BackColor="white" 
     GridLines="None" HeaderStyle-CssClass="Table_Header" RowStyle-CssClass="Table_Style" 
     OnRowDataBound="RowBound" runat="server"> 
     <Columns> 
      <asp:TemplateField> 
       <ItemTemplate> 
        <asp:Button runat="server" /> 
       </ItemTemplate> 
      </asp:TemplateField> 
      <asp:BoundField DataField="References" SortExpression="References" HeaderText="Total References" /> 
      <asp:BoundField DataField="Keyword" SortExpression="Keyword" HeaderText="Keyword" /> 
     </Columns> 
    </asp:GridView> 
</form> 
</body> 
</html> 

Ilekroć kliknij przycisk pojawia się błąd ...

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. 

znalazłem przyzwoitą ilość artykułów odwołujących się tego problemu, w tym kilka na SO, na przykład ...

Invalid postback or callback argument. Event validation is enabled using '<pages enableEventValidation="true"/>'

i ...

Invalid postback or callback argument

I może być po prostu nieporozumienie, ale o ile mogę powiedzieć, że tak naprawdę nie może mi pomóc. Jak mogę to wyłączyć bez ustawienia enableEventValidation = "false"?

EDYTOWANIE Wysłano cały kod dla mojej strony.

Odpowiedz

6

This fellow znalazł rozwiązanie podobnego problemu (przewiń w dół do około czwartego komentarza), który miał ustawić unikalne identyfikatory dla przycisków GridView.

+0

Próbowałem coś podobnego wcześniej, ale bez powodzenia. – Carter

+0

Ah ha! To było to. Zrobiłem coś głupiego i kod ustawiania identyfikatorów nie zawsze był uruchamiany. Dziękuję, sir! – Carter

0

Musisz podać identyfikator swojego przycisku. Po prostu runat = "server" nie spełnia minimalnych informacji, które należy podać, aby można było utworzyć kontrolę serwera.

+0

Posiadałem identyfikator przycisku w jednym punkcie. Jednak nie ma znaczenia, czy jest to ich czy nie. Powód, dla którego mój przycisk jest tak rzadki, jest taki, że starałem się maksymalnie uprościć problem. – Carter

+0

Czy możesz opublikować kod całej strony i strony wzorcowej, jeśli używasz? – TheGeekYouNeed

+0

Czyn jest zrobiony. Brak strony wzorcowej do opublikowania. – Carter

9

Wiem, że ten post jest stary, ale ostatnio miałem ten problem. Po sprawdzeniu jak kod został wygenerowany dla asp: ButtonField a także dla asp: przycisk, który dodałem w ItemTemplate odkryłem dość dużą różnicę:

asp: ButtonField: typ input = „button” onclick = "javascript: __ doPostBack ('ctl00 $ ctl00 $ cphMain $ cphContent $ gvEmails', 'SendFromBatch $ 0')" value = "Kontynuuj">

asp: Przycisk: input id = "ctl00_ctl00_cphMain_cphContent_gvEmails_ctl02_btnCont" type = "submit" onclick = "FreezeScreen (" Wysyłane są wiadomości e-mail ... ");" value = "Kontynuuj" name = "ctl00 $ ctl00 $ cphMain $ cphContent $ gvEmails $ ctl02 $ btnCont">

Typ był problemem! Więc po zmianie UseSubmitBehavior z "Prześlij" na "Fałsz" nie dostałem już błędu.

EDIT: Niedawno chciałem zmienić normalne btns na imgBtns, dzięki czemu mogę zaoszczędzić trochę miejsca i sprawić, że gridview będzie ładniejszy: D. Oczywiście pojawił się ten sam problem, a imagebtn nie ma właściwości UseSubmitBehavior, więc zacząłem zajmować się rozwiązaniem.

Znaleziono następujące (Poniższy kod znajduje się w UserControl). !

1) Bind w IsPostBack

2) Zarejestruj samego usercontrol w renderingu

i wszystko działa tak jak planowano - żadnych błędów walidacji.

protected void Page_Load(object sender, EventArgs e) 
    { 
     OnLoadingEvent(new EventArgs()); 

     if (!Page.IsPostBack) 
     { 
      gvEmails.DataSource = odsEmails; 
      try 
      { 
       gvEmails.DataBind(); 
      } 
      catch (Exception) 
      { 
      } 
     } 

     if (!writeText) divWriteEmail.Visible = false; 
    } 

    protected override void Render(HtmlTextWriter writer) 
    { 
     Page.ClientScript.RegisterForEventValidation(this.UniqueID); 

     base.Render(writer); 
    } 

EDIT: Grałem około z powyższym kodzie i zadawałem sobie pytanie, co jeśli faktycznie trzeba rebing swoją ObjectDataSource - co się wtedy stanie? Kod powyższy nie zadziała, jeśli ponownie zarejestrujesz ładowanie strony, ponieważ widok siatki ponownie się odbije po kliknięciu btn w wierszu gridview i nie zostanie rozpoznany jako wygenerowany na serwerze. Jasne i kwadratowe, ale jak uniknąć tego zachowania? Cóż ... znalazłem sposób, może nie najlepszy, ale to wystarczy.

W rzeczywistości nie chcesz ponownie powiązać widoku siatki po kliknięciu przycisku btn w wierszu polecenia gv ... ale skąd wiemy, że ponieważ metoda ładowania strony jest najpierw wywoływana? Cóż, właściwie nie chcę ponownie powiązać widoku siatki, jeśli wybrany parametr źródła danych obiektu nie ulegnie zmianie. Tak więc zachowuję wybrany parametr objectDataSource w widoku sesji i ponownie zwija mój gridview tylko wtedy, gdy jeden z nich się zmienia - to zachowanie jest tylko podczas zdarzenia PageLoad. Aby zobaczyć najnowsze wiersze, klikam przycisk "odśwież" i otrzymuj najnowsze wiersze bez problemu. W tym momencie klikam przycisk gvRow btn, błąd zniknie.

Aby to wszystko się stało trzeba

  1. Bezpośrednio wywołać .Wybrać() źródła danych obiektu
  2. złapać OnSelecting wydarzenie od źródła danych, zapisz select param ustawić np. Anuluj = true
  3. Sprawdź, czy select param są różne, a następnie powiązać GridView i tym razem podczas połowu OnSelecting trzeba ustawić e.Cancel = false, aby pobrać dane z bazy danych - tylko jeden raz.

Mam nadzieję, że to pomoże!

+0

Naprawiono również mój problem, wielkie dzięki! – bgs264

+0

Świetne, proste rozwiązanie, dzięki Ioana! 'ID =" xxx "runat =" server "UseSubmitBehavior =" false "' – wotney

2

miałem podobny błąd dzisiaj, ale z innym rozwiązaniem. Pracowałem z gridviewem od lat i nigdy nie miałem problemu, więc pomyślałem, że to musi być coś głupiego. Okazuje się, że zapomniał umieścić mój kod, który ładuje GridView w if(!Page.IsPostBack) bloku, który spowodował przycisk, aby zostać odtworzone po kliknięciu go, powodując błąd. Umieszczenie kodu ładowania we wspomnianym bloku wyeliminowało problem.

Powiązane problemy