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
- Rufen Sie direkt das .Select() des Objektdatenquellen auf
- Fangen Sie das OnSelecting-Ereignis von der Datenquelle ab, speichern Sie den Select-Parameter und setzen Sie e.Cancel = true
- Ü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!