none
Re escritura de código Javascript con RegisterClientScriptBlock. RRS feed

  • Pregunta

  • Buenas tardes compañeros, estoy trabjando en un proyecto ASP.Net, desarrollado con Framework 2.0 y C#. El problema o requerimiento que estoy teniendo es que cada vez que se carga la pantalla o se realiza un postback, me refresque un código java script que se ejecuta como validador al presionar un botón.

    Lo que vengo observando, es que una vez que se registra con el metodo en cuestión, no lo vuelve a pisar cuando pasa por el mismo lugar.

                StringBuilder sb = new StringBuilder();

                sb.Append("<script language=\"jscript\"> \n");
                sb.Append("function Approve() \n");
                sb.Append("{ \n");
                sb.Append(" var validadoresOK = true; \n");
                sb.Append(" if (typeof(Page_ClientValidate) == 'function')\n");
                sb.Append(" {\n");
                sb.Append("     Page_ClientValidate();\n");
                sb.Append("     validadoresOK = Page_IsValid;\n");
                sb.Append("     event.returnValue = true;\n");
                sb.Append(" }\n");
                sb.Append(" if (validadoresOK)\n");
                sb.Append(" {\n");

                if (SelectedItem.IsICFR.GetValueOrDefault() || (SelectedItem.DischargeType == Enums.DischargeType.DefinitiveExport && SelectedItem.GetProvisoryRelated != null && SelectedItem.GetProvisoryRelated.CustomAgent.Number != null))
                    sb.Append("   if (document.getElementById('" + hidAproveConfirmation.ClientID + "').value = confirm('Antes de realizar el cambio de estado se confirmará su acción. ¿Está seguro de que desea aprobar?')) return true; else return false;\n");
                else if (SelectedItem.CustomAgentNumber > 0)
                    sb.Append("   if (document.getElementById('" + hidAproveConfirmation.ClientID + "').value = confirm('Antes de realizar el cambio de estado se confirmará su acción. ¿Está seguro de que desea aprobar?')) return true; else return false;\n");
                else
                    sb.Append("   if (document.getElementById('" + hidAproveConfirmation.ClientID + "').value = confirm('Antes de realizar el cambio de estado se confirmará su acción. ¿Está seguro de que desea aprobar?')) return OpenPopUpCustomAgent(); else return false;\n");

                sb.Append(" }\n");
                sb.Append("}\n");
                sb.Append("</script>\n");

                (!ClientScript.IsClientScriptBlockRegistered(GetType(), "ScriptApprove"))
                    ScriptManager.RegisterClientScriptBlock(this, typeof(Page), "ScriptApprove", sb.ToString(), true);

    Por este código pasa varias veces, y cambien las condiciones o no siempre se verá el código como lo tomo y/o registro la primera vez.

    Gracias por su tiempo y colaboración.

    Javier Chércoles

    martes, 19 de febrero de 2019 17:51

Respuestas

  • Fíjate en que tienes una condición que dice "si este bloque no está registrado, regístralo". Lógicamente, a la segunda vez que pasas por ahí no hace nada, porque se encuentra que ya está registrado y se lo salta.

    Pero incluso aunque no pusieras el "if" no podrías reescribirlo una vez registrarlo, porque el RegisterClientScriptBlock no sabe hacerlo. Te recomiendo que en su lugar uses una variable para salvar el script. La variable sí que la puedes sobreescribir todas las veces que quieras. Y al final, cuando ya termine toda la ejecución del postback y ya vayas a devolver la página al cliente, entonces haces un RegisterClientScriptBlock de lo que tengas en la variable.

    Una vez terminado el postback, si te vuelven a hacer un submit de la misma página, a la siguiente vez partes de cero, porque los scripts registrados no se conservan entre postbacks.

    martes, 19 de febrero de 2019 21:32

Todas las respuestas

  • Fíjate en que tienes una condición que dice "si este bloque no está registrado, regístralo". Lógicamente, a la segunda vez que pasas por ahí no hace nada, porque se encuentra que ya está registrado y se lo salta.

    Pero incluso aunque no pusieras el "if" no podrías reescribirlo una vez registrarlo, porque el RegisterClientScriptBlock no sabe hacerlo. Te recomiendo que en su lugar uses una variable para salvar el script. La variable sí que la puedes sobreescribir todas las veces que quieras. Y al final, cuando ya termine toda la ejecución del postback y ya vayas a devolver la página al cliente, entonces haces un RegisterClientScriptBlock de lo que tengas en la variable.

    Una vez terminado el postback, si te vuelven a hacer un submit de la misma página, a la siguiente vez partes de cero, porque los scripts registrados no se conservan entre postbacks.

    martes, 19 de febrero de 2019 21:32
  • Gracias Alberto, me sirve tu ayuda, y la verdad que entre todo lo que pensé, esa opción no la tuve presente. Mil gracias.

    Javier.

    miércoles, 20 de febrero de 2019 12:43