2010-06-03 18 views
7

Ok, así que tengo un campo de la plantilla en un gridview que contiene sólo un simple botón ...botón TemplateField causando GridView no válida devolución de datos

<%@ 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> 

Cada vez que haga clic en el botón Me sale el error ...

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. 

he encontrado una buena cantidad de artículos que hacen referencia a este tema, incluyendo un par de SO, por ejemplo ...

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

y ...

Invalid postback or callback argument

que podría ser malentendido, pero por lo que yo puedo decir que en realidad no me ayuda. ¿Cómo hago para que esto desaparezca sin configurar enableEventValidation = "false"?

EDIT Publicada todo el código para mi página.

Respuesta

6

This fellow encontró una solución a un problema similar (desplácese hacia abajo hasta aproximadamente el cuarto comentario), que consistía en establecer identificadores únicos para los botones de GridView.

+0

Probé algo similar anteriormente, pero no tuve suerte. – Carter

+0

¡Ah, ja! Esto fue. Hice algo estúpido y el código de configuración de los ID no siempre se estaba ejecutando. ¡Gracias, señor! – Carter

0

Necesitas dar una identificación a tu botón. Solo un runat = "servidor" no cumple con la información mínima que debe proporcionarse para que se cree un control de servidor.

+0

Tuve una identificación de botón en un punto. Sin embargo, no importa si es suyo o no. La razón por la que mi botón es tan escaso es porque estaba tratando de simplificar el problema tanto como sea posible. – Carter

+0

¿puede publicar su código para toda la página y para la página maestra si está utilizando una? – TheGeekYouNeed

+0

La escritura está hecha. No hay una página maestra para publicar. – Carter

9

Sé que esta publicación es antigua, pero también tuve este problema recientemente. Después de comprobar la forma en que se genera el código para el asp: ButtonField y también para el asp: Button que he añadido en un ItemTemplate descubrí una gran diferencia:

asp: ButtonField: Tipo entrada "botón" = onclick = "javascript: __ doPostBack ('ctl00 $ ctl00 $ cphMain $ cphContent $ gvEmails', 'SendFromBatch $ 0')" value = "Continuar">

asp: Button: entrada id = "ctl00_ctl00_cphMain_cphContent_gvEmails_ctl02_btnCont" type = "enviar" onclick = "FreezeScreen ('Se envían correos electrónicos ...');" value = "Continuar" name = "ctl00 $ ctl00 $ cphMain $ cphContent $ gvEmails $ ctl02 $ btnCont">

¡El tipo era el problema! Entonces, después de cambiar el UseSubmitBehavior de "Enviar" a "False", ya no recibí el error.

EDIT: Hace poco quise cambiar de los btns normales a imgBtns para poder ahorrar algo de espacio y también hacer que la vista de cuadrícula sea más agradable: D. Por supuesto, tuve el mismo problema apareciendo y el imagebtn no tiene la propiedad UseSubmitBehavior, así que comencé a buscar una solución.

Encontrado lo siguiente (El siguiente código está en un UserControl). !

1) se unen en IsPostBack

2) Registrar el control de usuario en el mismo Render

y todo funciona según lo planeado - no hay errores de validación.

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: Yo estaba jugando con el código anterior y preguntó a mí mismo, lo que si realmente necesita para su rebing ObjectDataSource - qué pasa entonces? Bueno, el código anterior no funcionará si vuelve a enlazar en la carga de la página, porque la vista de la cuadrícula se recuperará nuevamente cuando haga clic en un btn en la fila de la cuadrícula y no se reconocerá como generado en el servidor. Justo y cuadrado, pero ¿cómo evitar este comportamiento? Bueno ... descubrí una forma, tal vez no la mejor, pero funciona.

En realidad, no desea volver a vincular la vista de cuadrícula cuando hace clic en una btn en la fila de gv ... pero ¿cómo lo sabemos desde que se llama por primera vez al método de carga de página? Bueno, en realidad no quiero volver a vincular la vista de cuadrícula si el parámetro de selección de la fuente de datos del objeto no cambia. Por lo tanto, guardo el parámetro de selección de objectDataSource en la vista de sesión y vuelvo a vincular mi vista de cuadrícula solo cuando uno de ellos cambia; este comportamiento solo ocurre durante el evento PageLoad. Para ver las filas más recientes, hago clic en actualizar y obtengo las últimas filas sin problemas y, en el momento en que hago clic en un gvRow btn, el error desaparece.

Para que todo esto suceda hay que

  1. llamar directamente a la .Elija() de la fuente de datos de objetos
  2. capturar el evento OnSelecting de la fuente de datos, seleccione guardar el parámetro establece la dirección. Cancelar = verdadero
  3. Compruebe si los parámetros de selección son diferentes y luego vincule la vista de cuadrícula y esta vez, al capturar OnSelecting, debe establecer e.Cancel = false para recuperar los datos de la base de datos, solo una vez.

Hope this helps!

+0

Resolvió mi problema también, muchas gracias! – bgs264

+0

Solución genial, simple, gracias Ioana! 'ID =" xxx "runat =" servidor "UseSubmitBehavior =" false "' – wotney

2

Tuve el mismo error hoy pero con una solución diferente. He trabajado con gridviews durante años y nunca tuve el problema, así que pensé que debía ser algo estúpido. Resulta que olvidé poner mi código que carga la vista de cuadrícula en un bloque if(!Page.IsPostBack) que causó que el botón fuera recreado después de que lo hice clic, causando el error. Colocar el código de carga en dicho bloque eliminó el problema.

Cuestiones relacionadas