none
Error al llenar un DropDownList desde Javascript (Argumento de postback o de devolución de llamadas no válido) RRS feed

  • Pregunta

  • Buenas desarrolladores,

    En estos días me he encontrado con algo en ASP.Net, y no le he podido encontrar una respuesta lógica al porque sucede este comportamiento.

    Bueno todo comenzó porque ahora se esta usando mas la carga de datos desde el cliente (yo uso javascript para tal propósito, usando llamadas a servicios REST), el caso es el siguiente, tengo una pagina aspx, en la cual tengo un control select de html (cboHtmlPrueba), un DropDownList (cboAspPrueba) y otro DropDownList con autopostback (cboAspAutoPostBack), algo así.

     <div>
                    <select id="cboHtmlPrueba"></select>
                    <asp:DropDownList ID="cboAspPrueba" runat="server"></asp:DropDownList>
                </div>
                <div>&nbsp;</div>
                <div style="border: 2px solid #0094ff; height:30px;">
                    <asp:DropDownList ID="cboAspAutoPostBack" runat="server" AutoPostBack="True">
                        <asp:ListItem Text="1" Value="1"></asp:ListItem>
                        <asp:ListItem Text="2" Value="2"></asp:ListItem>
                        <asp:ListItem Text="3" Value="3"></asp:ListItem>
                    </asp:DropDownList>

                </div>

    el cboAspPrueba lo lleno desde javascript con la siguiente función al cargar la pagina osea la llamo en el evento window.load()

    function LlenarCboAsp () {
                        var cboAsp = document.getElementById('cboAspPrueba');
                        var i = 0;

                        cboAsp.options[i] = new Option("-", "0", true);
                        for (i = 0; i < 11; i++) {
                            cboAsp.options[i + 1] = new Option("Opción " + i.toString(), i);
                        }
                    }

    Hasta el momento al ejecutar la pagina, bien el cboAspPrueba carga los datos, pero al realizar un postback se genera un error, que es el siguiente.

    Argumento de postback o de devolución de llamadas no válido. La validación de eventos se habilita usando <pages enableEventValidation="true"/> en la configuración o <%@ Page EnableEventValidation="true" %> en una página. Por motivos de seguridad, esta característica comprueba que los argumentos pasados a eventos de postback o de devolución de llamadas se origina desde el control del servidor que inicialmente los procesó. Si los datos son válidos y son los que se esperaba, utilice el método ClientScriptManager.RegisterForEventValidation para registrar los datos de postback o de devolución de llamadas para su validación.

    Bueno la solución es sencilla, y es colocar el atributo EnableEventValidation de la etiqueta Page en false, y todo funciona a la maravilla, pero esto me dejo con cierto malestar ya que buscando en la red no encontré una explicación lógica del porque, y lo que mas molesta es que simplemente estamos llenando el DropDownList con datos simples, lo único que dice es que es por seguridad osea que es recomendable que el atributo este en true (EnableEventValidation='true'), pero aquí lo dejamos en false y pues como lo dejamos con una brecha de seguridad. Intente registrando el control con ClientScriptManager desde el CodeBehid como recomienda en el mensaje de error pero no funciono, no se si lo he realizado mal, este fue el código que agregue.

    protected override void Render(HtmlTextWriter writer)
            {
                ClientScript.RegisterForEventValidation(cboAspPrueba.UniqueID, "tratando de registrar el control para su funcionamiento");
                base.Render(writer);
            }

    Ya llevo dos días dandole vueltas a esto y realmente no encuentro la respuesta logica a tal comportamiento ni de como solucionarlo para dejar el atributo EnableEventValidation en true.

    Agradezco a los que me despejen la duda y mas si hay alguna solución a lo que necesito


    • Editado Rubens x jueves, 2 de julio de 2015 14:00
    jueves, 2 de julio de 2015 13:56

Respuestas

  • Lo que pasa es que asp revisa el estado de la pagina en el ultimo postback, cuando vuelves a viajar al servidor asp detecta que la version actual de la pagina es distinta a la que habia en el ultimo postback (algun usuario pudiera hacerlo directamente en html)

    Por otro lado si defines EnableEventValidation = false dejaras algo insegura tu pagina,yo te recomiendo si vas a registrar algo al final lo hagas a traves de un webmethod con jquery con $..ajax, aqui te dejo un ejemplo:                           

      function registrar_responsables() {


                var parametros = {
                    id_valor: "1",


                };

                // Ahora hacemos la llamada tipo AJAX utilizando jQuery
                $.ajax({
                    type: 'POST',                               // tipo de llamada (POST, GET)
                    url: "Asignar_responsables.aspx/registrar_responsables",                // el URL del método que vamos a llamar
                    data: JSON.stringify(parametros),           // los parámetros en formato JSON
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",                           // tipo de datos enviados al servidor
                    success: function (data) {                      // función que se va a ejecutar si el pedido resulta exitoso

                        if (data.d == 0) {
                            alert("Tu registro se ha hecho correctamente");
                        }

                    },
                    traditional: true,
                    error: function (req, stat, err) {          // función que se va a ejecutar si el pedido falla
                        alert(req);
                    }
                });
            }

    Asi solo envias los datos que necesitas y no refrezcas la pagina


    Si mi respuesta fue útil ayudame marcándola como correcta.


    • Editado PIO DEVELOPER jueves, 2 de julio de 2015 18:31
    • Propuesto como respuesta PIO DEVELOPER jueves, 2 de julio de 2015 18:32
    • Marcado como respuesta Rubens x lunes, 6 de julio de 2015 20:38
    jueves, 2 de julio de 2015 18:30

Todas las respuestas

  • hola

    este problema que planteas es muy comun, es una validacion que implementa asp.net para evitar ataques, es que compara los items del dropdownlist contra el viewstate y si los modificaste desde javascript va a fallar

    deberias implementar lo qe comenta el mensaje de error, define el EnableEventValidation = false

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    jueves, 2 de julio de 2015 15:16
  • Lo que pasa es que asp revisa el estado de la pagina en el ultimo postback, cuando vuelves a viajar al servidor asp detecta que la version actual de la pagina es distinta a la que habia en el ultimo postback (algun usuario pudiera hacerlo directamente en html)

    Por otro lado si defines EnableEventValidation = false dejaras algo insegura tu pagina,yo te recomiendo si vas a registrar algo al final lo hagas a traves de un webmethod con jquery con $..ajax, aqui te dejo un ejemplo:                           

      function registrar_responsables() {


                var parametros = {
                    id_valor: "1",


                };

                // Ahora hacemos la llamada tipo AJAX utilizando jQuery
                $.ajax({
                    type: 'POST',                               // tipo de llamada (POST, GET)
                    url: "Asignar_responsables.aspx/registrar_responsables",                // el URL del método que vamos a llamar
                    data: JSON.stringify(parametros),           // los parámetros en formato JSON
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",                           // tipo de datos enviados al servidor
                    success: function (data) {                      // función que se va a ejecutar si el pedido resulta exitoso

                        if (data.d == 0) {
                            alert("Tu registro se ha hecho correctamente");
                        }

                    },
                    traditional: true,
                    error: function (req, stat, err) {          // función que se va a ejecutar si el pedido falla
                        alert(req);
                    }
                });
            }

    Asi solo envias los datos que necesitas y no refrezcas la pagina


    Si mi respuesta fue útil ayudame marcándola como correcta.


    • Editado PIO DEVELOPER jueves, 2 de julio de 2015 18:31
    • Propuesto como respuesta PIO DEVELOPER jueves, 2 de julio de 2015 18:32
    • Marcado como respuesta Rubens x lunes, 6 de julio de 2015 20:38
    jueves, 2 de julio de 2015 18:30