7 Stimmen

TemplateField-Schaltfläche verursacht GridView Ungültiges Postback

Ok, also ich habe ein Vorlagenelement in einem Gridview, das nur einen einfachen Button enthält...

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

    Keywords Administration

    Add a Keyword

Immer wenn ich auf den Button klicke, erhalte ich den Fehler...

Ungültiges Postback- oder Callbackargument. Die Ereignisvalidierung ist aktiviert durch 
 in der Konfiguration oder <%@ Page 
EnableEventValidation="true" %> auf einer Seite. Aus Sicherheitsgründen überprüft diese Funktion, 
ob die Argumente für Postback- oder Callbackereignisse vom Serversteuerelement stammen, 
das sie ursprünglich gerendert hat. Wenn die Daten gültig und erwartet sind, verwenden Sie die 
ClientScriptManager.RegisterForEventValidation-Methode, um die 
Postback- oder Callbackdaten zur Validierung zu registrieren.

Ich habe eine ansehnliche Anzahl von Artikeln zu diesem Problem gefunden, darunter auch ein paar bei SO, zum Beispiel...

Ungültiges Postback- oder Callbackargument. Die Ereignisvalidierung ist aktiviert durch ''

und...

Ungültiges Postback- oder Callbackargument

Vielleicht verstehe ich es einfach nicht, aber soweit ich sehen kann, helfen sie mir nicht wirklich. Wie kann ich das beheben, ohne enableEventValidation="false" zu setzen?

EDIT Den gesamten Code für meine Seite gepostet.

12voto

JJschk Punkte 431

Ich weiß, dieser Beitrag ist alt, aber ich hatte kürzlich auch dieses Problem. Nachdem ich überprüft habe, wie der Code für das asp:ButtonField und auch für den asp:Button generiert wurde, den ich in einem ItemTemplate hinzugefügt habe, habe ich einen ziemlich großen Unterschied festgestellt:

asp:ButtonField: 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('Emails are being sent...');" value="Weiter" name="ctl00$ctl00$cphMain$cphContent$gvEmails$ctl02$btnCont">

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

BEARBEITEN: Ich wollte kürzlich von normalen btns zu imgBtns wechseln, um etwas Platz zu sparen und auch die GridView schöner zu gestalten :D. Natürlich hatte ich das gleiche Problem und der Imagebtn hat keine UseSubmitBehavior-Eigenschaft, also begann ich nach einer Lösung zu suchen.

Fand folgendes (Der folgende Code befindet sich in einem UserControl).

1) Binden in !IsPostBack

2) Registrieren des Benutzersteuerelements selbst 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);
    }

BEARBEITEN: Ich habe mit dem obigen Code herumgespielt und mich gefragt, was passiert, wenn Sie tatsächlich Ihr ObjectDataSource neu binden müssen - was passiert dann? Nun, der obige Code wird nicht funktionieren, wenn Sie in der PageLoad neu binden, weil die GridView beim Klicken eines btn in der GridView-Reihe erneut gebunden wird und nicht als auf dem Server generiert erkannt wird. Fair und schön, aber wie vermeidet man dieses Verhalten? Nun... ich habe eine Möglichkeit herausgefunden, vielleicht nicht die beste, aber sie funktioniert.

Eigentlich möchten Sie die GridView nicht neu binden, wenn Sie auf einen btn in der gv-Reihe klicken... aber wie wissen wir das, da die page load-Methode als erstes aufgerufen wird? Nun, eigentlich möchte ich die GridView nicht neu binden, wenn sich der Select-Parameter des ObjectDataSource nicht ändert. Also behalte ich den Select-Parameter des ObjectDataSource in der Sitzungsansicht und binde meine GridView nur neu, wenn sich einer von ihnen ändert - dieses Verhalten tritt nur während des PageLoad-Ereignisses auf. Um die neuesten Zeilen zu sehen, klicke ich auf Aktualisieren und erhalte die neuesten Zeilen ohne Probleme und im Moment, in dem ich auf einen gvRow-Button klicke, verschwindet der Fehler.

Um all dies zu bewerkstelligen, müssen Sie

  1. Rufen Sie direkt das .Select() des Objektdatenquellen auf
  2. Fangen Sie das OnSelecting-Ereignis von der Datenquelle ab, speichern Sie den Select-Parameter und setzen Sie e.Cancel = true
  3. Überprüfen Sie, ob sich die Select-Parameter unterscheiden und binden Sie dann die GridView und dieses Mal, wenn Sie das OnSelecting auffangen, müssen Sie e.Cancel = false setzen, um die Daten aus der DB abzurufen - nur einmal.

Hoffe, dies hilft!

0 Stimmen

Große, einfache Lösung, danke Ioana! ID = "xxx" runat="server" UseSubmitBehavior="false"

6voto

DOK Punkte 31893

Dieser Kollege hat eine Lösung für ein ähnliches Problem gefunden (scrollen Sie bis zum etwa 4. Kommentar), bei dem eindeutige IDs für die Schaltflächen des GridView festgelegt wurden.

0 Stimmen

Ah ha! Das war es. Ich habe etwas Dummes gemacht und der Code zur Einstellung der IDs wurde nicht immer ausgeführt. Danke, mein Herr!

2voto

peroija Punkte 1932

Ich hatte heute einen ähnlichen Fehler, aber mit einer anderen Lösung. Ich arbeite seit Jahren mit GridViews und hatte noch nie das Problem, also dachte ich, es muss etwas Dummes sein. Es stellte sich heraus, dass ich vergessen hatte, meinen Code, der den GridView lädt, in einen if(!Page.IsPostBack)-Block zu setzen, was dazu führte, dass die Schaltfläche nach dem Klicken wiedererstellt wurde und somit den Fehler verursachte. Das Platzieren des Ladecodes in besagtem Block behob das Problem.

0voto

TheGeekYouNeed Punkte 7479

Sie müssen Ihrer Schaltfläche eine ID geben. Allein ein runat="server" reicht nicht aus, um die Mindestinformationen bereitzustellen, die für die Erstellung einer Serversteuerung erforderlich sind.

0 Stimmen

Ich hatte einmal eine Schaltfläche-ID. Es spielt jedoch keine Rolle, ob sie da ist oder nicht. Der Grund, warum meine Schaltfläche so spärlich ist, liegt darin, dass ich versucht habe, das Problem so einfach wie möglich zu gestalten.

0 Stimmen

Kannst du deinen Code für die gesamte Seite und für die Master-Seite posten, wenn du eine verwendest?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X