2010-06-03 4 views
7

Ok, also habe ich ein Template-Feld in einem Gridview bekommt, das nur eine einfache Schaltfläche enthält ...Template Taste verursacht Grid ungültig 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> 

Jedes Mal, wenn ich die Taste I den Fehler klicken ...

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. 

ich habe einen angemessenen Betrag von Artikelreferenzen auf dieses Problem gefunden, auf SO ein paar einschließlich zum Beispiel ...

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

und ...

Invalid postback or callback argument

kann ich nur Missverständnis, aber soweit ich das beurteilen kann sie wirklich mir nicht helfen. Wie bekomme ich das weg ohne die Einstellung enableEventValidation = "false"?

EDIT Posted den ganzen Code für meine Seite.

Antwort

6

This fellow gefunden eine Lösung für ein ähnliches Problem (scrollen Sie bis etwa zum 4. Kommentar), die eindeutige IDs für die GridView-Schaltflächen festgelegt wurde.

+0

Ich habe etwas ähnliches früher versucht, aber kein Glück. – Carter

+0

Ah ha! Das war's. Ich habe etwas Dummes gemacht und der Code, der die IDs gesetzt hat, wurde nicht immer ausgeführt. Vielen Dank, Sir! – Carter

0

Sie müssen Ihrem Button eine ID geben. Nur ein runat = "Server" erfüllt nicht die Mindestinformationen, die für die Erstellung eines Serversteuerelements bereitgestellt werden müssen.

+0

Ich hatte eine Taste ID an einem Punkt. Es ist jedoch egal, ob es ihr ist oder nicht. Der Grund, warum meine Schaltfläche so spärlich ist, liegt darin, dass ich versucht habe, das Problem so weit wie möglich zu vereinfachen. – Carter

+0

können Sie Ihren Code für die gesamte Seite und für die Masterseite eingeben, wenn Sie einen verwenden? – TheGeekYouNeed

+0

Die Tat ist erledigt. Keine Masterseite zum Posten. – Carter

9

Ich weiß, dass dieser Beitrag alt ist, aber ich hatte auch dieses Problem in letzter Zeit. Nach der Überprüfung der wie der Code für die ASP generiert: Button und auch für die asp: Button, den ich in einer ItemTemplate hinzugefügt habe ich ziemlich großen Unterschied entdeckt:

asp: Button: input type = „button“ onclick = "javascript: __ doPostBack ('ctl00 $ ctl00 $ cphMain $ cphContent $ gvEmails', 'SendFromBatch $ 0')" value = "Weiter">

asp: Button: input id = "ctl00_ctl00_cphMain_cphContent_gvEmails_ctl02_btnCont" type = "submit" onclick = "FreezeScreen ('E-Mails werden gesendet ...');" value = "Weiter" name = "ctl00 $ ctl00 $ cphMain $ cphContent $ gvEmail $ ctl02 $ btnCont">

Der Typ war das Problem! Also, nachdem ich die UseSubmitBehavior von "Submit" zu "False" geändert habe, habe ich den Fehler nicht mehr erhalten.

EDIT: Ich wollte vor kurzem von der normalen Btns zu ImgBtns ändern, so dass ich etwas Platz sparen und auch die Gridview schöner machen kann: D. Natürlich hatte ich das selbe Problem, und die imageBtn hat keine UseSubmitBehavior Eigenschaft, also habe ich nach einer Lösung gesucht.

Folgendes gefunden (Der folgende Code befindet sich in einem UserControl). !

1) Bind in IsPostBack

2) Registrieren Sie die Usercontrol sich in der Render

und alles funktioniert wie geplant - keine Validierungsfehler.

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: Ich spielte herum mit dem Code oben und fragte mich, was ist, wenn Sie tatsächlich Ihre Object rebing müssen - was passiert dann? Nun, der obige Code funktioniert nicht, wenn Sie beim Laden der Seite erneut binden, da die Gridview erneut angezeigt wird, wenn Sie in der Zeile der Gridview auf ein BTN klicken und es nicht als auf dem Server generiert erkannt wird. Fair und quadratisch, aber wie vermeidet man dieses Verhalten? Nun ... ich habe einen Weg gefunden, vielleicht nicht der beste, aber es macht den Trick.

Eigentlich möchten Sie die Gridview nicht erneut binden, wenn Sie auf ein btn in der Zeile des gv klicken ... aber woher wissen wir, dass die Methode zum Laden von Seiten zuerst aufgerufen wird? Nun, eigentlich möchte ich die Gridview nicht erneut binden, wenn sich der select Parameter der Objektdatenquelle nicht ändert. Also behalte ich den select-Parameter der objectDataSource in der Sitzungsansicht und verbinde meine Gridview nur, wenn sich eine von ihnen ändert - dieses Verhalten ist nur während des PageLoad-Ereignisses. Um die letzten Zeilen zu sehen, klicke ich auf Aktualisieren und erhalte die letzten Zeilen ohne Probleme und im Moment klicke ich auf einen gvRow btn, der Fehler verschwindet.

Um all dies geschehen Sie müssen

  1. direkt die .Select() aufrufen, des Datenobjekts Quelle
  2. Catch the OnSelecting Ereignis aus der Datenquelle, die Auswahl param speichern die E eingestellt. Cancel = true
  3. Überprüfen Sie, ob der select param unterschiedlich ist und binden Sie dann die gridview und dieses Mal müssen Sie beim Abfangen der OnSelecting e.Cancel = false setzen, um die Daten aus der Datenbank zu holen - nur einmal.

Hoffe, das hilft!

+0

Mein Problem behoben, vielen Dank! – bgs264

+0

Große, einfache Lösung, danke Ioana! 'ID =" xxx "runat =" Server "UseSubmitBehavior =" false "' – wotney

2

Ich hatte den ähnlichen Fehler heute aber mit einer anderen Lösung. Ich arbeite seit Jahren mit Gridviews und hatte das Problem nie, also dachte ich, es muss etwas Dummes sein. Es stellte sich heraus, dass ich vergessen hatte, meinen Code, der die GridView in einen if(!Page.IsPostBack) Block lädt, zu setzen, was dazu führte, dass der Button neu erstellt wurde, nachdem ich ihn angeklickt hatte, was den Fehler verursachte. Durch das Platzieren des Ladecodes in dem Block wurde das Problem beseitigt.

Verwandte Themen