lunes, 12 de abril de 2010

C# - [ASP.NET] - JavaScript alert() y confirm() - Como usar los mensajes

 

Introducción

En este articulo analizaremos algunas alternativas utilizadas para trabajar con alertas o pedir confirmación, mediante cuadros de mensaje en un proyecto web.

El uso de javascript en un desarrollo web con asp.net puede no ser tan simple como uno imagina, pues este código es ejecutado en el cliente, mientras que código .net se encuentra en el servidor.

Esta distinción de ambientes donde es ejecutado cada lenguaje puede traer problemas al momento de integrarlo, mas que al hacer uso de controles de brindados en asp.net que son claramente diseñador para trabajar por medio de requerimiento al servidor.

Uso del alert()

El uso del alert() de javascript es muy útil para informar al usuario de un suceso en la aplicación, pero este puede ser usado antes o después del postback o acción del usuario, lo que requiere distintas técnicas en cada caso.

Para demostrar estos casos en el formulario de nombre WebForm1.aspx trataremos el uso de las alertas.

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>
    <script type="text/javascript">
    
        function alerta(numero) {
            alert('Se ha presionado el boton: ' + numero);
        }
    
    </script>
    
</head>
<body>

    <form id="form1" runat="server">
        <table>
            <tr>
                <td>
                    <input id="btnMensaje1" type="button" value="Mensaje 1" onclick="alert('Se ha presionado el boton: 1');" />
                </td>
                <td>
                    <asp:Button ID="btnMensaje2" runat="server" Text="Mensaje 2" OnClientClick="alert('Se ha presionado el boton: 2');"  />
                </td>
                <td>
                    <asp:Button ID="btnMensaje3" runat="server" Text="Mensaje 3" OnClientClick="alert('Se ha presionado el boton: 3'); return false;"  />
                </td>
                <td>
                    <asp:Button ID="btnMensaje4" runat="server" Text="Mensaje 4" />
                </td>
             </tr>
             <tr>
                <td>
                    <asp:Button ID="btnMensaje5" runat="server" Text="Mensaje 5" 
                        onclick="btnMensaje5_Click" />
                </td>
                <td>
                    <asp:Button ID="btnMensaje6" runat="server" Text="Mensaje 6" 
                        onclick="btnMensaje6_Click" />
                </td>
                <td>
                    <asp:Button ID="btnMensaje7" runat="server" Text="Mensaje 7" 
                        onclick="btnMensaje7_Click" />
                </td>
                <td>
                    <asp:Button ID="btnMensaje8" runat="server" Text="Mensaje 8" 
                        onclick="btnMensaje8_Click"  />
                </td>
            </tr>
        </table>  
       
    </form>
</body>
</html>

public partial class WebForm1 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        btnMensaje4.Attributes["onclick"] = "alert('Se ha presionado el boton: 4'); return false;";  
    }

    protected void btnMensaje5_Click(object sender, EventArgs e)
    {
        string script = @"<script type='text/javascript'>
                            alerta(5);
                        </script>";

        if(!Page.IsClientScriptBlockRegistered("alerta"))
            Page.RegisterStartupScript("alerta", script);   
    }

    protected void btnMensaje6_Click(object sender, EventArgs e)
    {
        string script = @"<script type='text/javascript'>
                            alerta(6);
                        </script>";

        ScriptManager.RegisterStartupScript(this, typeof(Page), "alerta", script, false) ;
    }

    protected void btnMensaje7_Click(object sender, EventArgs e)
    {
        string script = @"<script type='text/javascript'>
                            alert('Se ha presionado el boton: 7');
                        </script>";

        ScriptManager.RegisterStartupScript(this, typeof(Page), "alerta", script, false);

    }

    protected void btnMensaje8_Click(object sender, EventArgs e)
    {
        try
        {
            throw new Exception("Se ha producido un error no controlado."); 
        }
        catch (Exception ex)
        {
            string script = @"<script type='text/javascript'>
                            alert('{0}');
                        </script>";

            script = string.Format(script, ex.Message);

            ScriptManager.RegisterStartupScript(this, typeof(Page), "alerta", script, false);

        }
    }
}

El código refleja distintas alternativas para trabajar con alertas, desde algunas muy simple al otras mas complejas.

btnMensaje1: Este simplemente es un botón simple de html, se hace uso del evento onclick para desplegar el alert

btnMensaje2: Este es el primer ejemplo con un botón de asp.net, vemos como el evento onclick aquí no esta disponible, se ha reemplazado por su equivalente OnClientClick. Un detalle de este método es que luego de despegar el mensaje el botón realiza el postaback de la pagina invocando los eventos del mismo.

btnMensaje3: A diferencia del anterior este introduce un pequeño truco, el agregado del “return false;”, ante un evento javascript que devuelva false, el postback del control al servidor es impedido

btnMensaje4: Este no define el evento en el html del control, sino que es en el evento Form_Load que se asigna haciendo uso de la colección Attributes. en realidad es otra forma valida de lograr lo mismo.

Suele suceder que a veces se necesita crear script con cierto dinamismo que solo se logra con código .net, de esta forma ese código javascript creado puede asignarse a un evento en un control para ser ejecutado.

btnMensaje5: En este caso se cambia un poco el concepto del ejemplo ya que aquí se muestra le mensaje a la vuelva del postback del evento del botón. Además se esta invocando a un método predefinido en el tag <script ..> del html

Esta técnica es muy útil cuando se quiere desplegar un mensaje luego de una operación realizada en el servidor.

Este hace uso de los métodos Page.IsClientScriptBlockRegistered() y Page.RegisterStartupScript(), paro debe aclararse que estos en la documentación del MSDN esta marcados como obsoletos, ya que hay nueva funcionalidad que los reemplazan.

btnMensaje6: Justamente en la implementación de este botón es que se hace uso de la forma actualizada en que se inyecta código javascript en una pagina.

Este hace uso del método ScriptManager.RegisterStartupScript y es este el que reemplaza a los método del ejemplo del btnMensaje5

btnMensaje7: Este demuestra que no siempre es necesario invocar a una funciona javascript en la pagina para mostrar una alerta, se puede generar código directo que muestre el mensaje.

btnMensaje8: Releja una alternativa muy interesante para visualizar errores que se producen en el servidor durante el procesamiento del postback del evento del botón.

En este caso se lanza un error a propósito que será capturado por el bloque try..catch, dentro de este se aplica las misma técnica descripta para en evento anteriores, solo que el mensaje a mostrar el usuario será el error que se atrapo en el servidor.

 

Uso del confirm()

Este aplica muchas de las técnicas ya reflejadas en el uso del alert(), pero hay ciertos detalles que es bueno remarcar.

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>

    <script type="text/javascript">

        function Confirmacion() {

            var seleccion = confirm("acepta el mensaje ?");

            if (seleccion)
                alert("se acepto el mensaje");
            else
                alert("NO se acepto el mensaje");

            //usado para que no haga postback el boton de asp.net cuando 
            //no se acepte el confirm
            return seleccion;
        
        }
    
    </script>

</head>
<body>
    <form id="form1" runat="server">

        <table>
            <tr>
                <td>
                    <asp:Button ID="btnConfirmacion1" runat="server" Text="Confirmacion 1" OnClientClick="return Confirmacion();"/>
                </td>
                <td>
                    <asp:Button ID="btnConfirmacion2" runat="server" Text="Confirmacion 2"  />
                </td>
                <td>
                    <asp:Button ID="btnConfirmacion3" runat="server" Text="Confirmacion 3" 
                            OnClientClick="return confirm('hacer el postback del control ?');"   />
                </td>
            </tr>
        </table>

    </form>
</body>
</html>

 

public partial class WebForm2 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        btnConfirmacion2.Attributes["onclick"] = "return Confirmacion();"; 
    }
}

btnConfirmacion1: Hace uso de la propiedad OnClientClick para definir el método javascript definido en la pagina.

Un punto importante es el uso de return como antecesor el nombre de la función

OnClientClick="return Confirmacion();"

El objetivo de este es evitar el postback del botón cuando no se acepte el mensaje de confirmación. Si este return es quitado se realiza la invocación al servidor se acepte o no el mensaje de confirmación.

btnConfirmacion2: Aplica la misma técnica del ejemplo anterior, solo que la asignación del evento es realizada desde el servidor.

btnConfirmacion3: Hace uso de código javascript en línea directo en el evento, sin utilizar una función definida para tratar la confirmación.

Es importante notar el uso del return delante el mensaje de confirm(), este tomara el respuesta y asignara true o false, permitiendo o no hace el postback del botón.

 

[C#]
[VB.NET]

139 comentarios:

  1. Disculpa podrias volver colocar el codigo en VB, porque no se puede descargar del skydrive
    Gracias

    ResponderEliminar
  2. Hola Edalo

    ya esta disponible el codigo para que lo descargues

    saludos

    ResponderEliminar
  3. Hola Leandro,

    Por favor me podrias decir si en el script puedo mandarle variables de code behind (en mi caso una clase en vb), tengo un ex.Message que necesito mandar en ese mensaje de alerta.

    Gracias.

    ResponderEliminar
  4. hola John

    La tecnica es la misma, solo que armaras el script dentro del bloque catch donde se produce el error.

    Podria ser algo como esto:

    Protected Sub btnProcesar_Click(ByVal sender As Object, ByVal e As EventArgs)

    Try

    'aqui el codigo del evento

    Catch ex As Exception

    Dim script As String = String.Format("alert('{0}');", ex.Message)

    ScriptManager.RegisterStartupScript(Me, GetType(Page), "alertaerror", script, True)

    End Try

    End Sub


    saludos

    ResponderEliminar
  5. Perdon leandro creo que estoy confundido. Donde pones gettype(Page). Que es Page? y El
    ScriptManager no me funciona.

    Yo lo tenia de esta manera pero no supe como incluir el Ex.Message.

    (script language='javascript' type='text/javascript'> alert('Informacion Incorrecta!.');</script)

    Lo puse entre () por que no me tomaba el comentario

    ResponderEliminar
  6. hola John

    Page es la propia pagina en la cual vas a escribir el script que creas

    En asp.net cuadno escribes codigo en el codebehind, tienes a disposicion este objeto directamente

    Es mas creo que si usas this, o Me en lugar de Page tambien funcion, porque representa a la pagina en donde estas registrando el script

    saludos

    ResponderEliminar
  7. Hola!
    Muy buena la información, se agradece.
    Con respecto a esto tengo una consulta. Mi confirm no siempre es gatillado después de presionar un botón. El que llame al confirm de javascript o no depende, por ejemplo de una variable. Mi código sería algo así:

    Protected Sub BtnGrabar_Click(ByVal sender As Object, ByVal e As System.EventArgs)

    if session("variable")="1" then
    ' Aquí llamar al confirmm, ¿pero cómo?
    end if

    End Sub

    Si alguien tiene una idea/sugerencia de cómo hacerlo la agradecería enormemente

    ResponderEliminar
  8. hola renezito

    Disculpa la tardanza de la respuesta

    Te comento, si entendi bien la pregunta podrias hacer algo como esto:

    Protected Sub BtnGrabar_Click(ByVal sender As Object, ByVal e As System.EventArgs)

    if session("variable")="1" then
    Dim script As String = "alert('la variable tiene valor 1');"

    ScriptManager.RegisterStartupScript(this, typeof(Page), "alerta", script, true)
    end if

    End Sub

    Como veras el mensajes estara condicionado al valor de la Session, y solo se mostara al usuario si este tiene el valor 1

    saludos

    ResponderEliminar
  9. Hola Leandro,

    He visto en distintos códigos con funciones JavaScript que se llaman con o sin(como en tu 1er codigo) "javascript:" delante, ¿es lo mismo llamar a la funcion con o sin especificar "javascript:" delante? Si no lo es, ¿cuando especificarlo(alerta()) o no(javascript:alert('agregar!!!'))?

    En el 1er codigo utilizas el parametro text="css/javascript" en lugar de language="javascript"¿Hay alguna diferencia entre ambos o son totalmente equivalentes?


    Gracias, Leandro:D

    ResponderEliminar
  10. hola fede

    Te comento que en realidad creo que es indistinto que pones el "javascript:" o no dentro del evento del control
    Pero se que se aplican ciertas reglas y en algunos casos.

    Si solo vas a llamar a una funcion simple que ejecutara una accion sin devolver un resultado que deba afectar al control que realizo la accion, puedes usar onclick="NombreFuncion()"
    y esto se ejecuta sin problemas.

    Ahora bien si necesitas que esta funcion de javascript devuelva un valor que afecte al control y evite determinada accion, como ser el postback (o submit), entonces si requieres que se declare completa la operacion definiendo el "return", como veras en los ejemplos.

    Pero no vi que sea obligatorio usar el "javascript:", si lo es el uso del "return" si es que quieres detener la accion del boton, segun el resultado de la funcion

    Aqui se realzia la misma consulta
    link

    saludos

    ResponderEliminar
  11. Gracias por la aclaración Leandro:D

    En cuanto a las formas de "declarar" el script (text="css/javascript" o language="javascript"), ¿cual me aconsejas?¿Son totalmente equivalentes o hay una mejor que otra?

    Gracias de nuevo, saludos:D

    ResponderEliminar
  12. hola fede

    En realidad te consejaria algo al estilo:

    <script type="text/javascript">

    Pues veras que el VS solicita en su validacion que el
    "type" este definido, que el "language" u otra propiedad este o no, no lo afecta, pero el "type" si.

    Por eso como minimo define esa propiedad

    saludos

    ResponderEliminar
  13. hola de nuevo leandro,
    "Pues veras que el VS solicita en su validacion...",¿A que te refieres con el VS?

    veras, se que no es el tema de este post, pero ¿?como puedo validar que se haya activado 1 radiobutton de los 2 que tengo?
    seria algo asi?:
    < script language="javascript" >
    function verify(form) {
    if((form.A.1.unchecked)&&(form.A.2.unchecked))
    alert('Antes debe seleccionar una opcion'); }
    }


    Gracias. saludos :D

    ResponderEliminar
  14. hola fede

    Disculpa la tardanza en la respuesta

    Por VS me refiereo al Visual Studio.

    por ahi probaria algo mas como esto

    <script language="javascript" >

    function verify()
    {
    var radio1 = document.getElementById("<%=radioburron1.ClientId%>");
    var radio2 = document.getElementById("<%=radioburron2.ClientId%>");

    if((radio1.unchecked)&&(radio2.unchecked))
    alert('Antes debe seleccionar una opcion');
    }

    </script>

    saludos

    ResponderEliminar
  15. Hola Leando, gracias por el aporte, muy bien explicado.

    Solo una cosa, cuando pongo tu código me aparece este error.

    Error 1 Se esperaba un identificador; 'return' es una palabra clave
    Error 2 Se esperaba;
    Error 3 El término de la expresión ')'no es valido

    Perdona pero soy nuevo en esto!

    ResponderEliminar
  16. hola Lenin

    Que raro, descague el codigo en c# localmente y lo compile sin problemas, tambien ejecuto sin marcar error

    has realizado alguna modificacion al codigo original ?


    saludos

    ResponderEliminar
  17. Hola Leandro, Quería consultarte como hacer una llamada a una función confirm del javascript pero desde un commandfield de una gridview.

    ResponderEliminar
  18. hola Patricia

    Veo complicado que desde un CommandField realices esto que necesitas.

    Quizas debas crear un ItemTemplate en donde uses un boton comun asignandole al mismo un CommandName para que lance el evento RowCommand y asi puedas trabajar la accion.

    Lo que permitira esto es que en el boton uses el OnClientClick que menciono en el articulo, pudiendo detener el evento si es que ese javascript devielve un false.

    O sea aplicar algo como esto

    GridView – Parte 1 - Javascript botón de eliminar con confirmación

    saludos

    ResponderEliminar
  19. Gracias Leandro, me has salvado una practica, te felicito por el articulo, muy bien redactado, explicado, el codigo sencillo y conciso, añado tu blog en las direcciones de interes de mi navegador.

    ResponderEliminar
  20. hola leonardo te hago una consulta ya que estoy en aprietos queriendo presentar del lado del cliente "mensajes" provocados del lado del servidor.
    Si desde una clase que tengo en la carpeta App_Code (que no hereda de una página) de mi proyecto, necesito mostrar un ex.message de mi bloque try-catch. Cual sería el primer parámetro "Type" que debería usar en el método ClientScript.Registerstartupscript.
    La última, como hago si dentro del procedimiento 'sub', que tengo para el evento click de un boton "eliminar" en una página que está en una MasterPage. Quiero mandar un mensaje de confirmacion (¿desea eliminar si/no?), y en función de la acción del cliente, seguir del lado del servidor, con la acción de eliminar o salir. Como me conviene implementarlo?

    Soy muy novato en el tema y vengo luchando hace unas semanas sin poder avanzar, desde ya muchas gracias, y me pareció excelente los ejemplos, saludo Marcelo.

    ResponderEliminar
  21. hola Marcelo

    1-
    es que desde la clase que esta en el App_Code no deberias usar el
    ClientScript.Registerstartupscript

    este es claramente de presentacion y es en el codigo de la pagian dodne deberias armar el script y enviar el mensaje

    desde la clase podrias enviar el Exception hacia arriba o sea dejarlo continuar y que sea atrapado por el evento de la pagina para mostrar el mensaje, pero claramente esto deberia estar en la presentacion no en funcionalidad por fuera, es por eso que encuantras poco natural el uso de este metodo porque lo estas ubicando en un lugar que no corresponde

    a lo sumo el codigo del App_Code podrias cambiar el mensaje de error quizas usando alguna exception custom que podrias crear, pero deberia devolver el error para que el evento genere el mensaje suando el Registerstartupscript



    2-
    mmm este punto no es muy simple de lograr no al menos de la forma en como lo has planteado

    lo que deberias lograr es pedir la confirmacion antes de ejecutar evento alguno contra el servidor, o sea detener el evento si es que cancela

    si tienes algun boton

    <asp:Button id='eliminar' OnclientClick='return Confirmar();' ... />

    como veras ese confirmar es una funcion javascript que eviaria el postback si se rechaza el mensaje

    esto esta implementado en el articulo

    lo dificil es que se haga el postback, se vuelva a pedir una conformacion y se continue, eso no se podria haceral menos con los medio tradicionales, quizas con jquery y algun truco se podria acercar bastante pro es algo mas complejo

    saludos

    ResponderEliminar
  22. muchas gracias Leandro por tu celeridad, voy a seguir tus consejos para el punto 1. Que desde la pagina donde utilizo alguna función de la clase App_Code poder obtener las excepciones que se generen en ésta última, para así, sí poder mostrarlas desde la página. Y para el punto2 investigar de hacer algo como bien indicas con jquery y AJAX. Nuevamente muchas gracias por tu ayuda. saludos.

    ResponderEliminar
  23. Hola Leandro Yo denuevo, mira tengo el siguiente problema.

    cree un proyecto ServerControl para crear validadores personalizados, por ejemplo un para el Rut.

    dentro de este un script que permite realizar esta validacion en el cliente, todo funciona perfecto, hasta que este control fue incluido dentro de un UpdatePanel, funciona solo la primera ves y luego de actualizar el update panel deja de funcionar en el cliente y solo funciona en el servidor.

    entiendo que indicas que se debe usuar ScriptManager.RegisterStartupScript, pero este proyecto no me permite usar este control que puedo hacer???

    asi esta implementado:

    protected override void OnPreRender(EventArgs e)
    {
    if (this.DetermineRenderUplevel())
    CreateJavaScript();

    base.OnPreRender(e);
    }
    ....
    protected void CreateJavaScript()
    {

    if (!Page.ClientScript.IsStartupScriptRegistered("ValidationRutScript"))
    {
    string script = @"

    function RutValidator(ctrl)
    {
    ...
    }";

    Page.ClientScript.RegisterStartupScript(GetType(), "ValidationRutScript", script, true);

    ResponderEliminar
  24. hola Freddy

    Es que si trabajas con el UpdatePanel, estas obligado a usar el ScriptManager

    con el ClientScript no te va a funcionar.

    lo que podrias hacer es poner el ScriptManager en la pagina y en el control un ScriptManagerProxy

    [How Do I:] Use an ASP.NET AJAX ScriptManagerProxy?

    saludos

    ResponderEliminar
  25. Hola Leandro, no comprendo como implementar el ScriptManagerProxy en un server control, yo creo que tendre que desachar la vonita idea de crear mis validadores personalizados y debere usar un CustomValidator

    ResponderEliminar
  26. hola Freddy

    no entendi, como se relaciona el ScriptManagerProxy con las validaciones y el CustomValidator ?

    imagino usas un UpdatePanel, pero estas creando UserControl, con validaciones

    Walkthrough: Using Validation Controls Inside an UpdatePanel Control

    saludos

    ResponderEliminar
  27. Buenas tardes Leandro, te molesto por lo siguiente. Necesito hacer algo como lo que le planteaste a John:

    Dim script As String = String.Format("alert('{0}');", ex.Message)

    ScriptManager.RegisterStartupScript(Me, GetType(Page), "alertaerror", script, True)

    Pero con un mensaje de confirm que tengo en la base de datos. Basicamente mi aplicacion es multilenguaje y el mensaje viene desde la base, con lo cual yo necesito validar con el usuario cada acción de ABM con un mensaje de estos. Lamentablemente no estoy tan familiarizado con JavaScript que por lo que veo, permite hacer muchisimas cosas que de manera contraria no se podrian. Saludos y disculpa la molestia

    ResponderEliminar
  28. hola Tincho

    Se me ocurre rapidamente que podrias armar el string del javascript de forma dinamica en el codigo .net del servidor, para luego por medio del

    ScriptManager.RegisterStartupScript()

    publicar el script con los mensajes en el idioma que recuperaste desde la db

    por supuesto harias esto en el evento Load de la pagina web, y no debe estar dentro del if(!IsPostBack)
    porque necesotas que este javascript se genere en la accion de cada evento

    enn el articulo veras ejemplos de como usar el RegisterStartupScript:

    [ASP.NET] - JavaScript alert() y confirm()

    saludos

    ResponderEliminar
  29. ola Buenas noches por varias paginas como llamar a una funcion de javascript desde c# pero no consigo hacerlo tu das una solucion pero me dice que eso del Page.RegisterStartupScrip es absoleto si me pudieras asesorar te lo agradeceria att alberto

    ResponderEliminar
  30. hola Sica

    es que deberias usar el
    ScriptManager.RegisterStartupScript()

    es el "ScriptManager", no el "Page"
    por eso marca obsoleto

    saludos

    ResponderEliminar
  31. hola mira tengo un problema espoero me puedas ayudar, loq ue pasa es que quiero hacer una llamda a una funcion de javasrcipt al hacer clic en un boton, lo hice de esta forma y todo funciona Master.Page.ClientScript.RegisterStartupScript(this.GetType(), "alert", "alert('hola mundo');", true); el problema es que como utilizo un update panel si hago click en el boton que esta dentro del updatepanel no me manda a llamar a mi funcion y si lo hago de un boton fuera funciona perfecto espero y me haya explicado

    ResponderEliminar
  32. hola Sica

    es que con el UpdatePanel el Page.ClientScript no funciona

    debes usar el ScriptManager, como lo hago en el articulo

    saludos

    ResponderEliminar
  33. Hola, primero buen aporte, y tengo una pregunta si quiero almacenar el resultado que obtuvo un confirm() en vb como lo podría hacer en este momento lo obtengo asi: Response.Write(-script-javascript:if(confirm('¿Esta solicitud dispone de adjuntos, desea descargarlos?'));-/script-) pero como evaluo el resultado??
    Gracias y Saludos

    ResponderEliminar
  34. hola Nelson

    el tema es que estas en dos lugares muy distintos el confirm aplica en el cliente y vb.net aplcia en el servidor

    podrias si te animas con jquery a realziar una invocacion usando $.ajax para poder invocar al server sin postback

    seria algo como esto

    [ASP.NET][jQuery] Validación sin Postback


    si validas los temas de jquery del blog hay otros articulos que tratan el tema, pero basicamente de esa forma podrias pasar al server la confrmacion desde el cliente

    saludos

    ResponderEliminar
  35. Hola leandro,
    Estoy aplicando tu ejemplo en c#, pero tengo el sig.error 'Input string was not in a correct format.' me lo marca en la parte de script = string.Format (script, ex.Message); no acepta el formato. Estoy utilizando VS2010 en web.

    gracias

    ResponderEliminar
  36. hola Viridiana

    mmm no sabria decirte sin el contexto de esa linea
    quizas puede ser que el script defina un string que aplica un formato incorrecto

    saludos

    ResponderEliminar
  37. Hola Leandro!.
    Tengo un Formulario web de registro y quiero agregarle un mensaje de confirmación, pero quiero que este se ejecute después de que halla validado los campos, ya que este todo lleno correctamente me diga que los datos son correctos y que me pregunte si deseo o no continuar.
    escribí el mensaje en el evento onclientclick pero este me ejecuta el evento antes de validar los campos, como lo controlo.
    Me Podrias ayudar.
    Saludos.

    ResponderEliminar
  38. hola Chipujin

    pero entonces no has revidado los ejemplos de este articulo, porque veras que si quieres desde codigo .net se genere un script el cual se ejecuta en el cliente debes usar:

    ScriptManager.RegisterStartupScript()

    saludos

    ResponderEliminar
  39. Hola Leandro. Tengo una duda. Yo tengo en mi proyecto de asp.net un archivo .js donde voy escribiendo mis funciones de javascript. A estas funciones las puedo convocar agregandolas como atributos de algun componente. cosa.attributes.add
    Lo que no logro hacer, es que cuando se está cargando mi pagina se convoque a una de estas funciones del .js
    No quiero usar el RegisterStartupScript, porque tendria que volver a escribir mi script. Yo solo quiero convocar en el load una funcion de mi archivo .js
    Desde ya agradezco tu ayuda.

    ResponderEliminar
  40. hola Ignacio

    no se si entendi el planteo del problema

    pero si estas usando jquery podrias usar el

    $(function(){
    nombrefuncion();
    });

    ese bloque se ejecuta cuando se carga la pagina, alli reemplaza el nombre de la funcion que quieres ejecutar
    esto lo pones dentro del bloque <script>
    y solo es valido si usas jquery

    saludos

    ResponderEliminar
  41. Leandro: Gracias por responder. Ehm... no, creo que me explique mal. No uso jquery. Solo tengo un archivo de javasscript que agregue en el proyecto de asp.net. Lo agregue en blanco y alli voy escribiendo mis funciones script.
    El tema es que, hasta ahora siempre las convocaba agregando como atributo a algun componente como por ejemplo:

    Me.LinkButton3.Attributes.Add("onclick", "javascript:return Ubicar('" + Me.PanRegistro.ClientID + "');")

    y ahi convoco a la funcion Ubicar() de mi archivo.js

    Yo lo que queria saber, es si habia alguna manera de convocarla sin que se la agregue como un atributo a algo. Porque necesito que se ejecute en el load.

    Espero que esta vez me haya explicado bien. (a veces me cuesta jajaja).

    ResponderEliminar
  42. O sea, haciendo:

    Dim Script As New System.Text.StringBuilder
    Script.Append("<4script>document.getElementById('" + Me.PanRegistro.ClientID + "').style.visibility='hidden';" & vbCrLf)
    Script.Append("" & vbCrLf)
    Page.RegisterStartupScript("ClientScript", Script.ToString)

    en el load de mi pagina me funciona a la perfeccion. Pero yo ya tengo escrita esa funcion en mi archivo.js. Simplemente quiero convocarla.

    ResponderEliminar
  43. hola Ignacio

    podrias usar el OnClientClick para definir el evento del link sin un atributo

    no lo he probado pero podria ser

    <asp:LinkButton ... OnClientClick="return Ubicar('" + Me.PanRegistro.ClientID + "');">

    ojo no lo he probado

    saludos

    ResponderEliminar
  44. Saludos Leandro:
    Tengo el Siguiente escenario,supongamos que tengo una lista de opciones en un radioList,entonces quiero mostrarle un mensaje antes de grabar cuando el cliente seleccione una determinada opcion,"Desea Establecer el Estado Ejecutado al Evento?", si la respuesta es "Si" que grabe el registro.

    ResponderEliminar
  45. hola Posvaldo

    podrias suar algo como ser

    <asp:Button runat="server" onclick="button1_click" OnClientClick="return confirm('Desea Establecer el Estado Ejecutado al Evento?');">

    como veras el confirn sera quien pida la validacion y el onclientclick solo hara postback al evento para grabar si es que se confirmo sino se anula el evento al server

    saludos

    ResponderEliminar
  46. Hola Leandro:
    No entiendo los parametros de esta funcion, si me lo podría explicar

    ScriptManager.RegisterStartupScript(this, typeof(Page), "alerta", script, false) ;

    Muchas Gracias!

    ResponderEliminar
  47. hola Dario

    ScriptManager.RegisterStartupScript

    en el link podras ver los parametros que este metodo define

    saludos

    ResponderEliminar
  48. Leandro, gracias por tu tiempo y dedicación.
    Estoy empezando con ASP.Net y C#, y debo escribir código para un mensaje de alerta. Hice paso por paso la propuesta 8, pero al ejecutar no aparece el mensaje de alerta. Pot ahí, en otra página, leí que decías que había que poner ScriptManager en la página en la que se produce el error puesto que de otro modo no funcionaba; esto no lo sé hacer... Simplemente agregué el código y de tu artículo. Te reitero mi agradecimiento porque sin haberte preguntado nunca, me has ayudado mucho.

    ResponderEliminar
  49. hola Marcelo

    el ScriptManager en principio deberia ser una clase que usas de forma directa, en el codigo solo pones el nombre de esta clase y deberias poder usarla

    esta proporciona metodos para registrar codigo javascript que es compatible con el uso del updatePanel, por eso es tan importante

    basicamente defiens un string con el javascript que quieres registrar y luego usas el metodo que explico en el articulo

    saludos

    ResponderEliminar
  50. Hola Leandro gracias por tus aportes son buenisimos. tengo este problemita con el evento onclientclick lo que sucede es q no me esta eliminando te paso el codigo








    protected void gvProveeddores_RowCommand(object sender, GridViewCommandEventArgs e)
    {
    try
    {
    int indicefila;
    indicefila = Convert.ToInt16(e.CommandArgument);// indice de la fila seleccionada
    if (e.CommandName == "Editar")
    {
    //Guardamos en una variable de sesion el codigo del vendedor seleccionado
    Session["Cod_Ven"] = gvProveedores.Rows[indicefila].Cells[2].Text;
    Response.Redirect("ProveedorMan03.aspx");
    }

    else if (e.CommandName == "Eliminar")
    {
    if (_ProveedorBL.EliminarProveedor(gvProveedores.Rows[indicefila].Cells[2].Text))
    {
    gvProveedores.DataSource = _ProveedorBL.ListarProveedor();
    gvProveedores.DataBind();
    }
    else
    {
    lblMensaje.Text = "El vendedor no se pudo eliminar porque esta vinculado a otras tablas";
    }
    }
    }
    catch (Exception ex)
    {
    lblMensaje.Text = "Se produjo el error..." + ex.Message;
    }
    }
    el MENSAJE QUE ME SALE ES EL DEL CATCH ES DECIR NO HACE EFECTO , NO ELIMINA, AGRADEZCO TU AYUDA
    PDTA: tengo tu demo de mensajes de confirmacion pero ahi no eliminas por eso te pido ayuda,gracias una vez mas

    ResponderEliminar
  51. hola Aldo

    no veo que relacion tiene el onclientclick con el rowcommand

    pero veo que comentas que la ejecucion pasa por el catch lo cual me lleva a preguntar que mensaje de error recibes ? que mensaje devuelve el exception

    saludos

    ResponderEliminar
  52. Hola leandro, estoy tratando de hacer una redireccion en el confirm pero no me funciona, me podrias decir que estoy haciendo mal?



    function Confirmacion() {
    var seleccion = confirm("acepta el mensaje ?");
    if (seleccion) {
    location.href = 'delete.aspx?id=9&pagina=Presentacion';
    } else {
    alert("NO se acepto el mensaje");

    return seleccion;
    }
    }




    boton:

    ResponderEliminar
  53. Hola Leandro Tuttini como le podria aser para crear mi codigo java scrip y mandarlo a llamar en un form visual para que apareca el mensaje despues de cierta accion

    ResponderEliminar
  54. Hola Leandro Tuttini como le puedo aser para crear un codigo javascrip que lo pueda mandar a llamar a un formilario VB para que aparesca despues de cierta accion como un tipo msgbox???

    ResponderEliminar
  55. hola Andres

    no probaste con

    window.location.href = 'delete.aspx?id=9&pagina=Presentacion';

    ademas si pones un alert() esa guncion se ejecuta?

    saludos

    ResponderEliminar
  56. hola PAredes

    deberias usar el ScriptManager para generar codigo javascript algo como ser

    public void MostrarMensaje(string msg){

    string script= "alert('mensaje');";

    ScriptManager.RegisterStartupScript(this, typeof(Page), "alerta", script, true);

    }

    saludos

    ResponderEliminar
  57. Hola Leandro ya solucione el problema anterior, ahora lo que no puedo es pasarle un parametro a la funcion, siempre me da error que esta mal formado, esta es la linea que tengo en mi repeater.



    gracias de nuevo

    ResponderEliminar
  58. esa es la linea

    OnClientClick='return Confirmacion("<%#Eval("IdPresentacion")%>")'

    ResponderEliminar
  59. Hola Leandro este es mi codigo:

    funcion javascript

    function Confirmacion(id) {

    var seleccion = confirm("¿Estas seguro de querer borrar el registro?");

    if (seleccion) {
    location.href = 'delete.aspx?id=' + id + '&pagina=Conocimiento';
    //usado para que no haga postback el boton de asp.net cuando
    //se acepte el confirm
    return false;
    }
    }




    button:
    OnClientClick='<%# Eval("IdConocimiento", "return Confirmacion({0})") %>'

    me parece que esta igual al que pusiste vos,en mi servidor local me funciona bien, pero cuando lo subo me tira el siguiente error:

    No se puede mostrar un cuadro de diálogo o formulario modal cuando la aplicación no está en modo UserInteractive. Especifique el estilo ServiceNotification o DefaultDesktopOnly para mostrar una notificación de una aplicación de servicio.

    no se porque, en teoria con javascript tendria que funcionar, no se que estoy haciendo mal.
    Saludos y gracias

    ResponderEliminar
  60. hola

    si despues de desplegarse la pagina en el browser, ves el codigo html del mismo, puede ver que la invocacion a la funcion de confiracion se define de forma correcta?


    OnClientClick="return Confirmacion('<%#Eval("IdPresentacion")%>')"

    el valor del parametro deberia estar con comillas simples

    saludos

    ResponderEliminar
  61. Hola Leandro, el problema es que cuando veo el html despues que carga el browser, veo esto onclick="return Confirmacion(8);" como vos decis le falan las comillas al parametro, pero la unica forma que lo pude pasar es asi, de cualquier otra forma me dice que esta mal formado
    OnClientClick='<%# Eval("IdCliente", "return Confirmacion({0})") %>'

    y aca no se donde ponerle las comillas simples porque siempre me dice que esta mal formado si las pongo.

    donde las pongo? o si sabes alguna otra forma de pasarlo, porque ya me quede sin ideas..

    Muchas Gracias

    ResponderEliminar
  62. hola Andres

    si se complica armarlo en el html, porque no lo haces en codigo .net, podrias definir el evento RowDataBound del gridview y alli definirlo

    private void GridView1_RowDataBound(...)
    {
    DataRow row = ((DataRowView)e.Row.DataItem).Row;

    Button btn = e.Row.FindControl("button1") as Button;

    btn.OnClientClick = string.Format("return Confirmacion('{0}');", row.Field("IdCliente"));

    }

    saludos

    ResponderEliminar
  63. Hola Leandro, te cuento que probe hacerlo como me decis, y entre otras formas que probe esta la siguiente.



    href="if (confirm('Continue?')) { window.location.href='delete.aspx?id=<%#Eval("IdCliente")%>&pagina=Cl' } else { void('') }; ">

    en todas me pasa lo mismo, todo funciona bien, me aparece el alert y me redirecciona si hago click en aceptar, pero cuando entra en la pagina delete, no me ejecuta mi codigo que tengo en el load, el codigo del delete te lo pongo aqui abajo:


    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Try
    Dim id As Integer = CType(Request.QueryString("id"), Integer)
    Dim pagina As String = Request.QueryString("pagina")

    Select Case (pagina)

    Case "Cl"

    aca elimino el cliente
    End Select

    Catch ex As Exception
    PageHelper.MsgBox(ex.Message)
    End Try
    End Sub

    realmente no se que puede ser, cuando trabajo de forma local funciona bien, el probelma es cuando lo pongo en mi servidor online.

    Muchas gracias

    ResponderEliminar
  64. hola

    estas seguro que al ponerlo en el servidor no se genera ningun error ?

    prueba quitar el try..catch dejalo sin nada y ejecuta en el servidor a ver si recibes una pagina de error

    saludos

    ResponderEliminar
  65. Hola
    Perdona que haya borrado el anterior post, pero ya encontré la solución.
    Otro problemilla: Tu codigo va perfecto, me pregunta si acepto o no. Si acepto ejecuta el codigo VB y si cancelo sigue en el formulario. Perfecto. Pero, una vez pulsado el aceptar y realizado el codigo VB ¿Podria volver a salir una ventanita que diga por ejemplo, "grabacion realizada correctamente" con un boton aceptar y crear así una salida más elegante?
    Gracias

    ResponderEliminar
  66. hola Jaume

    podrias volver a generar un alert desde codigo vb.net para que registre el alert() que tiene que mostrar

    o sea una vez que hayas completado la operacion en .net registra el alerta con ese mensaje que informe que todo se completo correctamente usando el ScriptManager.RegisterStartupScript()

    saludos

    ResponderEliminar
  67. Gracias Leandro.

    En tu ejemplo llamas al mensaje con "alert" y ello hace que salga un triangulito de alerta en la ventana. He buscado por internet para ver otras opciones y no encuentro nada. ¿Hay alguna otra llamada para que no salga el triangulito de alerta y salga otro mas conforme con el mensaje "Grabación realizada correctamente?

    Saludos

    ResponderEliminar
  68. hola Jaume

    el mensaje estandar de javascript es el alert y no se puede cambiar

    si necesitas algo diferente quizas debas usar jquery

    podrias usar jquery UI dialog
    para definir un cuadro de mensaje

    esto lo defines fijo en .js y luego lanzas al funcion que muestre ese dialogo con el contenido personalizado

    saludis

    ResponderEliminar
  69. Leandro:
    Muy buen ejemplo de uso de javascript, quería complementar tu respuesta a Jaume, que existe otro plugin de jquery que se llama jquery Alert Dialogs el que me ha sido bien útil para dejar mensajes de alerta más vistosos. Dejo una página para que puedan ver ejemplos para reemplazar lo siguiente:

    javascript | jquery Alerts
    alert -> jAlert
    prompt -> jPrompt
    confirm -> jConfirm

    http://www.actualidadjquery.es/2010/11/01/jalert-substituto-del-alert-prompt-y-confirm-en-jquery/

    ResponderEliminar
  70. Muchas gracias a los dos. Por lo que veo tendré que empezar a mirar la libreria jquery, parece que puede sacar de muchos apuros.

    Gracias.

    ResponderEliminar
  71. Hola Leandro

    primero que todo gracias por tu explicación me sirvió de mucho, pero tengo una duda y es que quiero mostrar un mensaje del error de una excepción que esta en otra clase, como hago para que se muestre en la pagina que quiero.

    Harold

    ResponderEliminar
  72. hola Harold

    podrias realizar un control global de errores

    Processing Unhandled Exceptions

    para asi redireccionar a la pagina que procese el error

    tambien podrias ver de usar el tag <customerrors> del web.config

    saludos

    ResponderEliminar
  73. Hola!
    Quiero llenar un gridview por medio de un botón, haber si lo puedo explicar, a la hora de darle clic al botón me aparezca el directorio para que el usuario seleccione la tabla que que quiera (la tabla en access) y cuando le de abrir automaticamente llene el gridview, en asp.net

    ResponderEliminar
  74. Hola!
    Por favor me podrías auxiliar, como puedo llenar un gridview por medio de un botón, haber si me explico, cuando el usuario le de clic al botón (seleccione tabla) aparezca un directorio y que seleccione la tabla que quiera (la tabla debe de ser access),cuando el usuario allá seleccionado la tabla le de clic a abrir y en ese momento se llene el gridview

    por favor
    gracias

    ResponderEliminar
  75. hola

    bueno no es algo facil de explciar porque requiere muchos pasos

    - el primer punto sera mostrar un popup de seleccion, esto puede ahcerlo con jquery o modal popup extender

    [ASP.NET] PopUp Filtro – Usando jquery UI Dialog

    - despues mencionas listar las tablas de access, para esto deberias acceder al schema de la db

    http://social.msdn.microsoft.com/Forums/es-ES/vcses/thread/9205feef-4713-4f75-b2ae-24f2f599e997/

    - despues ya queda solo seleccion el nombre y armar la query que cargaria el grid, pero eso es solo ado.net simple en donde pondrias el nombre de la tabla concatenendo el string para armar la query

    saludos

    ResponderEliminar
  76. Hola!
    Ya estuve revisando lo del popup y jquery pero aun no me queda muy claro, ya vi el link pero aun no le entiendo muy bien, este proceso lo tengo en C# pero lo quiero cambiar a ASP.NET

    Saludos

    ResponderEliminar
  77. hola Irmuchis

    no entendi muy bien, que proceso es el que tienes en c# ? la seleccion de algo al usuario requiere de una interaccion

    quizas si el planteo requiere publicar codigo o imagenes seria mejor si se plantea en el foro

    asp.net foro

    alli se puede publicar mejor el codigo

    saludos

    ResponderEliminar
  78. Hola Leandro!!
    Este es el código en C# que quiero pasar a ASP.NET

    private void button1_Click(object sender, EventArgs e)
    {
    //Stream sa = null;
    OpenFileDialog arch = new OpenFileDialog();
    arch.InitialDirectory = "c:\\";
    arch.Filter = "accdb files (*.accdb)|*.accdb|all files(*.*)|*.*";
    arch.FilterIndex = 2;
    arch.Title = "BUSCAR TABLA";
    arch.RestoreDirectory = true;
    if (arch.ShowDialog() == DialogResult.OK)
    {
    OleDbDataAdapter old = new OleDbDataAdapter("Select * from tabla", con);
    DataSet ds = new DataSet();
    old.Fill(ds);
    dataGridView1.DataSource = ds.Tables[0];

    }
    }
    en C# todo se hace en código .cs y en asp.net por lo que eh visto es por medio de código en diseño, es decir por medio de script

    ResponderEliminar
  79. hola Irmuchis

    ese codigo no se puede traducir a asp.net porque no existe ningun equivamente para el OpenFileDialog

    lo mas parecido es usar un control FileUpload en la pagina asp.net, pero esto no funcionara de la misma forma en que lo planteas en ese codigo, porque deberias subir una db al servidor para poder usarla

    no creo que esto que intentas hacer este correcto

    saludos

    ResponderEliminar
  80. Hola Leandro!!

    Si tienes razón,ya que estuve probando con el fileupload y nomas nada, anteriormente mencionabas lo del popup o jquery, esto me serviría o definitivamente no hay opciones para poder hacerlo.

    Saludos y gracias

    ResponderEliminar
  81. De nuevo yo
    O en su defecto habrá una forma de que se seleccione la tabla y se llene automáticamente el gridview.
    ayuda porfis

    gracias

    ResponderEliminar
  82. hola Irmuchis

    si tienes una base de datos, podrias obtener el schema de esta y recuperar los nombres de las tablas para listarlos en un combo donde el usuario seleccione

    http://social.msdn.microsoft.com/Forums/es-ES/vcses/thread/cf7690cd-2b6f-46c9-a903-7b9959fa8be5/

    en el link menciono este tema, para cualquier db es igual ya que usas ado.net

    saludos

    ResponderEliminar

  83. Gracias Leandro, estoy revisando el link.

    Saludos

    ResponderEliminar
  84. Hola, podias hacerme el favor de como implementar el mensaje de confirmacion 2 veces (doble), osea, Sale primer mensaje al decir q si, q salga otro preguntando si esta segurisimo, y si le da si se aplica lo que esta en el evento Button1_Click... espero pronta respuesta, es en ASP.NET C#

    ResponderEliminar
  85. hola Juanchope

    recuerda que para deteenr o no el evento del boton basta con devolver true/false como resultado de la funcion javascript

    por eso podrias tomar la respuesta de un confirm para evluarlo nuevamente

    var respuesta1 = confirm('desea eliminar?');

    if(respuesta1){

    var respuesta2 = confirm('esta seguro?');

    return respuesta2;
    }

    return false;

    saludos

    ResponderEliminar
  86. Gracias leandro me distes la idea perfecta, ya acomode para q se validara asta lo ultimo, pal que le sirva quedo asi:

    //DOBLE MENSAJE DE CONFIRMACION EN ASP.NET

    var respuesta1 = confirm('desea eliminar?');

    if(respuesta1){
    var respuesta2 = confirm('esta seguro?');
    if(respuesta2){
    return true;
    }
    }
    return false;

    eso en el diseñador de su pagina, en el code Load llaman a la Funcion :D y al crear al boton le activan el OnClick :D

    ResponderEliminar
  87. Hola Leandro
    prodrias ayudarme en como mostrar el RAISERROR de mi procedimiento almacenado en mi asp.net c#
    en el catch.
    Gracias

    ResponderEliminar
  88. hola Gabriel

    pero deberia ser directo si usas

    catch(Exception ex){

    MessageBox.Show(ex.Message);
    }

    eso deberia mostrar la descripcion del error que retorne el procedure

    saludos

    ResponderEliminar
  89. Hola me podrias decir como puedo mostrar un alert despues de clicar un boton y que la informacion haya sido guardada en la BD? Despues de dar Aceptar al Alert redirigirse a otra pagina?

    El flujo es Clicar en Boton Aceptar la informacion se guarda en la BD y aparece el alert con el mensaje, Usted acepto el contrato y sera redirigido a la siguiente pagina.

    Al dar clic en aceptar del alert se rediriga a "x" pagina.

    ResponderEliminar
  90. hola

    veo bastante dificil los pasos que planteas realizar, recuerda que esto no es un desarrollo winform, no puedes ir y venir con los mensajes como guste porque requieres un ida y vuelta al servidor

    podrias lanzar desde el servidor un mensaje como lo planteo en el articulo, pero despues para redireccionar a otro pagina deberias seguir con codigo cliente, usando el

    window.location.href="url";

    asi al aceptar el dialogo redireccionas a otra pagina

    saludos

    ResponderEliminar
  91. hola leandro, sabes si existe alguna forma de enviar un confirm al abandonar una forma web aspx, ya sea cerrando el navegador o cambiando de forma (cambiar de forma depende de un menú de formas que es parte del master page), solo quiero mostrar este confirm en un forma, intente sobrescribir el evento OnUnload y dentro de este poner código javascript pero no me funciona alguna idea de como lograrlo?

    ResponderEliminar
  92. hola david

    podrias detectar esto que planteas desde javascript usando

    window.onbeforeunload

    Llamar funcion solo cuando oprima el boton cerrar


    saludos

    ResponderEliminar
  93. Buen dia, una duda y si el alert lo quiero realizar dependiendo de una condicion y no al hacer click sobre el boton por ejemplo

    if (CantidadAsiganda > CantidadAsignable)
    {
    Deplegar Mensaje
    }

    Muchas gracias de antemano

    ResponderEliminar
  94. hola Willians

    pero esta condicion en que accion la defines ? es en codigo cliente o en algun evento en codigo .net

    porque si es codigo .net necesitas registrar la invocacion al evento javascript para que al volver el response al cliente se ejecute

    saludos

    ResponderEliminar
  95. Buen dia, le explico el caso tengo un gridview con los renglones de una recepcion, al editar una fila puedo asignar la cantidad a recibir del renglon pero esta no debe exceder la cantidad esperada. de alli lo de CantidadASignada>CantidadAsignable

    para complicar un poco mas las cosas esto esta dentro de un updatepanel:


    el codigo detras es el siguiente:

    protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
    int CantEntregada = int.Parse(e.NewValues[0].ToString());
    int AsigMax = int.Parse(GridView1.Rows[e.RowIndex].Cells[6].Text);
    int Entregado;
    if (CantEntregada > AsigMax)
    {
    Entregado = AsigMax;


    AQUI IRIA LA LLAMADA AL ALERT()

    }
    else
    {
    Entregado = CantEntregada;
    }

    .:Aqui va el codigo para guardar los cambios:.
    }

    ResponderEliminar
  96. Buen dia, Intente esto, quitando el updatepanel y tampoco consegui que me levante el mensaje:

    ClientScript.RegisterStartupScript(this.GetType(), "myScript", "< script >javascript: alert('La cantidad es superior a la asignable, \n se establecio el maximo de " + AsigMax.ToString() + " .');< /script >");

    ResponderEliminar
  97. hola Willians

    y si utilizas el ScriptManager como lo realizo en este el articulo

    con este podrias registrar una accion unque utilicen updatepanel
    algo como ser:

    string script = string.Format("alert('La cantidad es superior a la asignable, \n se establecio el maximo de {0}.');", AsigMax);

    ScriptManager.RegisterStartupScript(this, typeof(Page), "alerta", script, true) ;


    saludos

    ResponderEliminar
  98. Leandro disculpa que te moleste, pero estoy en un dilema y quizas puedas arrijar una luz.
    Realice un javascript alert con codigo.
    Este codigo lo traigo de una base de datos y luego ejecuto el script. El tema es el siguiente cuando cargo ejemplo un comentario, este se carga en la BD pero no sale en el script, si agarro ese item de la bd y lo vuelvo a pegar con un UPDATE reemplazando eel anterioir (aclaro sin editar nada, solo copio y pego) el script me lo muestra, pense que podria ser un tema de espacios en blanco, asi que antes de cargqar a la BD el comentario le pongo un TRIM(COMENTARIO), pero tampoco funciona.
    Ahora esto tampoco pasa siempre ya que en comentario cortos no tengo este inconveniente.
    Espero tu respuesta y aprovecho para agradecerte por compartir todo lo que sabes con la comunidad.
    SALUDOS

    ResponderEliminar
  99. Cordial Saludo Leandro, quisiera saber como implementar una confirmación al cambiar la seleccion de un DropDownList en asp.net. Como quien dice, que pregunte si esta seguro que quiere hacer el cambio y que luego de preguntar, realice una operacion en codigo servidor. Muchas gracias!!!

    ResponderEliminar
  100. hola Juan

    no validaste si este texto tiene algun caracter especial que podria estar causando algun error en javascript

    has probado aplicar un Encode al texto antes de ponerlo en el script ?

    valida tambien sino se genera algun error en la pagina, podrias usar FireFox con el plugin de FireBug para detectar si se produce algun error y poder visualizarlo

    saludos

    ResponderEliminar
  101. hola Stivenson

    esta confirmacion la necesitas realizar desde codigo cliente o desde servidor

    si es desde servidor podrias poner el evento SelectedIndexChanged al combo y la propiedad AutoPostBack = true, para que funcione el evento

    entonces desde codigo .net defines el mensaje como lo explico en el articulo

    saludos

    ResponderEliminar
  102. Leandro gracias por la ayuda, te comento que lo resolví el inconveniente.
    Después de realizar pruebas me di cuenta que en el textbox multiline al apretar la tecla enter, este guarda en SQL Server el carácter aunque no lo veía y ahí estaba el error. Lo que hice fue reemplazar en el código de visual basic cuando pedía este campo de la tabla y luego lo envía a JAVA para el alert

    Muchas gracias por tu tiempo

    ResponderEliminar
  103. Leandro, como puedo implementar un CONFIRM con javascript dentro de un botón en un GridView?

    Tengo un GridView que me muestra nombres de ficheros en disco y le implementé un botón con la acción de borrar el archivo a cada ROW ( )

    Actualmente al dar clic en la imagen de la X se borra el archivo, pero quiero mostrar antes una ventana de confirmación, se me ocurria implementar con javscript el confirm. Pero cómo hacerlo?

    ResponderEliminar
  104. En el comentario anterior me faltó colocar que para la imagen de la X utilizo cun asp:ButtonField

    ResponderEliminar
  105. Hola Leandro,
    Muy bueno tus blog, tengo una consulta.
    tengo un GridView con una campo de Select y un textbox donde el usuario ingresa un numero dentro del textbos del gridview y el Select lo coloque como un boton y al presionarlo inserta el registro con el valor colocado en el txtbox en la base de datos.
    Necesito que cuando el registro que se halla insertado envie un mensaje de confirmacion indicando que ya esta insertado y si acepta se vuelva a inserta de lo contrario no haga nada.
    Ya tengo la validacion de cuando el registro esta repetido solo seria hacer que abra la ventana y tomar el retorno si acepta o no.
    Espero me puedas ayudar con este dilema.

    ResponderEliminar
  106. hola como envio una variable a una funcion javascript desde c#

    ejemplo

    funcion alerta(mensaje){
    alertify.alert( mensaje, function () {})
    };

    cuando precione un boton quiero enviar la variable para el mensaje

    ResponderEliminar
  107. hola angel

    para enviar algo desde c# requieres que se de un postback al servidor, a la vuelta es que usarias el ScriptManmager.RegisterStartupScript()
    para registrar el codigo cliente en javascript que pondria el valor desde el servidor y lo enviaria al cliente

    por supuesto tambien existe la forma usando ajax, usando jquery y $.ajax para invocar un webmethod que seria quien envia la info del servidor al cliente

    saludos

    ResponderEliminar
  108. hola Eduardo

    esto que planteas esta algo dificil de lograr ya que la confirmacion del confirm() de javascript que envies desde el servidor y muestre en el cliente requiere que se realice otro postback a un evento, para esto se podria usar el _doPostBack() entonces envias nuevamente la accion al evento en el servidor usando javascript

    aunque tambien podrias usar jquery con una invocacion $.ajax() a un webmethod en el servidor, esto sin que se recargue la pagina ante una invocacion a un evento

    saludos

    ResponderEliminar
  109. buen dia:
    Necesito ayuda para poder realizar una validación en c#, la cual no se como validar en caso de que el usuario cancele, y este realice otras cosas, ya que si hay mas código abajo las ejecuta sin mostrar el mensaje.
    ScriptManager.RegisterStartupScript(this, typeof(Page), "capturaPendiente", scrip, false);

    espero haber explicado de manera correcta.
    Gracias,saludos

    ResponderEliminar
  110. hola Chris

    no se si entendi del todo el problema, pero recuerda que esto no es un desarrollo desktop, no se puede mostrar al usuario un mensaje que este confirme y continuar donde habias quedado, no es asi como funciona un entorno web

    si quieres algo como eso vas a tener que realizar dos llamadas a eventos diferentes, por supuesto el segundo evento lo lanzarias de forma automatica con codigo javascript usando el _doPostBack()

    http://social.msdn.microsoft.com/forums/es-ES/bb4c06b5-ad10-47aa-8499-f3d25960eba7/confirm-message

    saludos

    ResponderEliminar
  111. buen día Leandro:

    Antes que nada gracias por tu respuesta.

    Ya cheque el link, de hecho ya habia comenzado a probar con el _doPostBack, solo que parece no funcionarme, ya que cuando entra al evento load en la página dentro de la condición isPostBack el valor es falso :(.
    Este el código que utilizo:

    Captura = "NoPendiente";
    $("#__EVENTARGUMENT").val(Captura);
    __doPostBack('', Captura);
    location.href = "PaginaX.aspx";

    Gracias por tus aportaciones.

    ResponderEliminar
  112. Hola otra vez;

    Pensando un poco más en el objetivo de esto, sería posible que antes de redireccionar la página pudiera asignar una variable a null, para que este realice otras cosas, ya que el postback no me funciona :~

    ResponderEliminar
  113. hola Chris

    cuando hace el doPostBack a que evento lo redireccionas ? porque veo que defines un argument pero no le indicas a que evento de que control

    ademas no le veo sentido hace un doPostBack y el la linea siguiente el location.href, porque estas invocando un evento, no se puede redireccionar desde alli, podrias usar el Response.Redirect() cuando estes dentro del evento

    desde javascript podrias asignar el valor de cualquier control, aunque no entendi lo de la variable, estas estan en el servidor o es una variable de javascript ?
    recuerda que estas en el servidor o en el cliente y uno no puede acceder al otro sino hay una accion en medio
    o como comente salvo que uses jquery con una invocacion ajax

    saludos

    ResponderEliminar
  114. Leandro como le agrego un CssClass al mensaje que se provoca en el cuadro del mensaje, lo digo para poder darle formato con Css.

    Gracias.

    ResponderEliminar
  115. hola Franky

    a un mensaje alert() de javascript no se le puede dar estilo

    si quieres estilos deberias usar un plugin de jquery, como ser

    jquery alert


    saludos

    ResponderEliminar
  116. Hola Leandro
    ante todo muchas gracias por tu ayuda,
    quisiera preguntarte cual de tus ejemplos utilizo para mandar un alerta en el lado cliente, por ejm si el usuario no selecciona un item de un combo o deja un campo vacio envie un alerta pero sin que vaya al servidor. gracias por tu rpta

    ResponderEliminar
  117. hola Aldo

    podrias usar el RequestFieldValidator
    con este control podrias validar la seleccion del combo

    Dropdownlist validation in Asp.net Using Required field validator

    si el combo tiene algun item por defecto podrias indicarlo

    saludos

    ResponderEliminar
  118. Hola, yo solo deseo recibir el aceptar o cancelar para saber si imprmo o no un repore, puse este codigo:

    function Confirmacion() {
    var seleccion = confirm("Desea Imprimir El Gasto?");
    return seleccion;
    }

    Pero como lo podria recoger en el codigo para hacer alguna accion dependiendo de si presionaron aceptar o no

    algo como esto que hago en windows form:

    var result = MessageBox.Show("Desea Imprimir el Gasto?", "Impresion...", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
    if (result == DialogResult.Yes)
    {
    ImprimeGasto(NoGasto.Text);
    }

    ResponderEliminar
  119. hola Carlos

    o sea quieres recibir la seleccion que se realizo en el cliente, en el codigo .net en el servidor ?

    http://social.msdn.microsoft.com/Forums/es-ES/e945031e-d129-4ffd-bfa2-8e5c1483e7d7/tengo-un-botn-confirmcmo-capturo-la-accion-de-aceptar-o-cancelar?forum=netfxwebes

    http://social.msdn.microsoft.com/Forums/es-ES/c3f3622c-b744-46ca-99dc-af5a7b8b1631/pasar-variables-desde-javascript-a-c?forum=vcses

    como veras podrias asignar la seleccion a un control hidden de asp.net para asi al realizarse el postback al evento poder tomar la seleccion que realizo el usuario

    saludos

    ResponderEliminar
  120. Mi estimado
    Habra alguna manera de usar el alert un poco mas dinamico, es decir, tal vez ponerle una imagen o tal vez poner un titulo de un color y el tennxo principal de otro color

    Gracias

    ResponderEliminar
  121. hola Christian

    usando solamente javascript me temo que no, pero si usas jquery podrias implementar este plugin

    jquery Alert

    jAlert,jConfirm,jPrompt VS alert y lo tradicional

    saludos

    ResponderEliminar
  122. Hola estoy viendo todas tus publicaciones y son excelentes.... necesito de tu ayuda...
    el tema es que tengo una tabla clientes una tabla de cuotas y otra de estados

    necesito sacar la fecha de vencimiento de la cuota y compararla con la fecha de pago y ver si esta vencida no se pago.. hacer que el estado del cliente se ponga en moroso

    ResponderEliminar
  123. hola ivana

    no conozco la estructura de las tablas

    la fecha de pago donde la persistes?

    queres solo obtener la fecha de la cuota del mes en curso, o las cuotas llevan una marca indicando si fueron pagadas?

    saludos

    ResponderEliminar
  124. Hola Leandro agradezco tu información.
    tengo una consulta utilizo uno de tus métodos para enviar el Script al archivo JS desde Mi Form de ASP.NET (C#)

    string script2 = @"type='text/javascript'> Valida_Rut('" + TextBox1.Text + "')

    ScriptManager.RegisterStartupScript(this, typeof(Page), "Valida_Rut", script2, false))

    /*Borre las etiquetas scrip para que me tomara el comentario*/

    La función JavaScrip es un poco larga como para escribirla, pero lo que hace es, si el rut(Chileno) es verdadero retorna un true y si es falso retorna un false, esos booleanos que retorna como yo puedo administrarlos en el form de asp.net (C#). ejemplo querer decirle si me retorna un false hacer un break hasta que envié un true en el booleano del javascrip

    Te lo agradecería un montón amigo, no se si me explique bien.

    ResponderEliminar
  125. hola Ruben

    esta claro que el bool que se genera en el cliente no puedes accederlo en el servidor

    quizas podrias asignar el valor a un hidden de asp.net y realizar un post a un evento para poder tomarlo

    tambien podrias usar jquery con $.ajax para enviarlo el servidor por medio de un webmethod

    saludos

    ResponderEliminar
  126. Hola leandro, tengo una consulta. Al seleccionar un boton se da la opcion de guardar un informe tanto en xls como en pdf. Luego de salvar ese informe en lugar de mostarr una alerta con javascript le digo que cierre esa pantalla y cargue la pantalla anterior. ANtes de agregarle a la pantalla el control ScriptManager funcionaba correcto ahora ya no funciona, es decir luego de mostrar el informe no vuelve a la pantalla anterior con el siguiente codigo:
    Page.ClientScript.RegisterStartupScript(this.GetType(), "myCloseScript", "if (window.opener != null){window.open('','_self','');window.opener.UpdatePendientes();window.close();} else {window.location.href='Pendientes.aspx';}", true);

    ResponderEliminar
  127. hola eugerodriguez

    el problema es que estas usando el Page.ClientScript cuando deberias estar usando el ScriptManager.RegisterStartupScript() como lo realizo en este articulo

    el Page.ClientScript no funciona cuando usas controles de ajax

    saludos

    ResponderEliminar
  128. Leandro Me podrias ayudar te comento tengo la siguiente función

    function msg() {
    if (confirm('Deseas aceptar')) {

    --aca mi condición
    }

    El problema que tengo es que quiero personalizar osea quisiera algo así:

    function msg() {
    if (confirm('Deseas aceptar','titulo de cabecera')) {

    --aca mi condición
    }

    no da error pero sigue mostrando igual la pantalla

    ResponderEliminar
  129. hola karla

    el tema es que el confirm() no tiene para personalizar el titulo

    si quieres algo como eso tendrias que ir a un dialogo de jquery
    jalert demo
    jAlert,jConfirm,jPrompt VS alert y lo tradicional

    saludos

    ResponderEliminar
  130. hola leandro tengo un pregunta
    es sobre como inyectar un codigo html en especial un radio button a un string .formt en c#
    nota en vb no tengo problema en c# es mi problema
    output.Text = String.Format("<input type=""radio"" name=""ContactoGrillaRadio"" id=""RowSelector{0}"" value=""{0}""", intIndexContacto.ToString)

    output.Text &= " />"

    Espero que me pueda dar una ayuda muchas gracias

    ResponderEliminar
  131. Que tal Leandro,

    Tengo una pregunta, a que se debe que despues de ejecutar el codigo javascript la fuente de la pagina web cambie de estilo y tamaño?

    Estoy enredado en esto.

    Saludos.

    ResponderEliminar
  132. Hola muestra tardes alguien me puede ayudar como agregar la referencia System.Web.UI.WebControls en c#
    muchas gracias saludos

    ResponderEliminar
  133. hola Fernando

    esta muy raro el planteo que realizas, si el proyecto es web ya tendria esta referencia

    o sea trata de otro tipo de proyecto, como ser un Class Library ?
    salvo que estes pensando alguna libreria para custom controles o quizas alguna para ayudarte con alguna funcionalidad que requiere la UI web, pero sino no es muy recomendable lo que pretendes realizar

    saludos

    ResponderEliminar
  134. hola Rodrigo

    como generas el mensaje javascript, imagino usas el ScriptManager.RegisterStartupScript()

    saludos

    ResponderEliminar
  135. hola leandro, tengo una duda....

    mi botón ya tiene su confirm y funciona perfectamente, pero debo validar unos dropdownlist antes de que arroje el confirm y no encuentro la manera de hacerlo, te comento como están mi código:

    Propiedades del button

    ID="btn_Generate" runat="server" Text="Generate Folders" OnClick="btn_Generate_Click" OnClientClick="if(!confirm('Are you sure want to create folder?')){return false}"
    ValidationGroup="validators" CausesValidation="true"


    FUNCIÓN BOTÓN
    protected void btn_Generate_Click(object sender, EventArgs e)
    {
    Page.Validate("validators");
    Generar();
    }

    entonces obviamente me debe validar al dar click en el botón, no encuentro la manera que valide al dar click en el botón antes de que me aviente el confirm.. que puedo hacer al respecto? Saludos y gracias!

    ResponderEliminar
  136. hola Diana

    deberias mover al funcion separandola del control usando

    <script>
    function confirmar()
    {
    var dato = document.GetElementByTagID("<%=DropDownList1.ClientID%>").value;
    var seleccion = confirm('Are you sure want to create folder?');

    if(seleccion)
    {
    //aqui otra logica
    return true;
    }

    return false;
    }
    </script>

    entonces defines

    OnClientClick="return confirmar();"

    saludos

    ResponderEliminar
  137. Buen dia podria por favor corregir el link de descarga del codigo , estan rotos.
    Gracias

    ResponderEliminar