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]

128 comentarios:

Edalo dijo...

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

Leandro Tuttini dijo...

Hola Edalo

ya esta disponible el codigo para que lo descargues

saludos

John Fredy Baeza Sanchez dijo...

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.

Leandro Tuttini dijo...

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

John Fredy Baeza Sanchez dijo...

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

Leandro Tuttini dijo...

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

renezito dijo...

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

Leandro Tuttini dijo...

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

fede dijo...

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

Leandro Tuttini dijo...

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

fede dijo...

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

Leandro Tuttini dijo...

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

fede dijo...

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

Leandro Tuttini dijo...

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

Lenin Moreno Penna dijo...

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!

Leandro Tuttini dijo...

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

Patricia dijo...

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

Leandro Tuttini dijo...

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

Joaquín dijo...

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.

Marcelo dijo...

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.

Leandro Tuttini dijo...

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

Marcelo dijo...

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.

Freddy dijo...

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);

Leandro Tuttini dijo...

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

Freddy dijo...

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

Leandro Tuttini dijo...

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

Tincho dijo...

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

Leandro Tuttini dijo...

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

Sica dijo...

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

Leandro Tuttini dijo...

hola Sica

es que deberias usar el
ScriptManager.RegisterStartupScript()

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

saludos

Sica dijo...

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

Leandro Tuttini dijo...

hola Sica

es que con el UpdatePanel el Page.ClientScript no funciona

debes usar el ScriptManager, como lo hago en el articulo

saludos

Nelson dijo...

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

Leandro Tuttini dijo...

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

Viridiana dijo...

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

Leandro Tuttini dijo...

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

Chipujin dijo...

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.

Leandro Tuttini dijo...

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

Ignacio dijo...

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.

Leandro Tuttini dijo...

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

Ignacio dijo...

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).

Ignacio dijo...

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.

Leandro Tuttini dijo...

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

Posvaldo dijo...

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.

Leandro Tuttini dijo...

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

Dario Alenczyk dijo...

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!

Leandro Tuttini dijo...

hola Dario

ScriptManager.RegisterStartupScript

en el link podras ver los parametros que este metodo define

saludos

Marcelo D. Ferrer dijo...

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.

Leandro Tuttini dijo...

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

Aldo Salazar dijo...

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

Leandro Tuttini dijo...

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

Andres Cipoletti dijo...

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:

PAredes dijo...

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

PAredes dijo...

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???

Leandro Tuttini dijo...

hola Andres

no probaste con

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

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

saludos

Leandro Tuttini dijo...

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

Andres Cipoletti dijo...

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

Andres Cipoletti dijo...

esa es la linea

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

Andres Cipoletti dijo...

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

Leandro Tuttini dijo...

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

Andres Cipoletti dijo...

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

Leandro Tuttini dijo...

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

Andres Cipoletti dijo...

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

Leandro Tuttini dijo...

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

Jaume Estrany Mas dijo...

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

Leandro Tuttini dijo...

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

Jaume Estrany Mas dijo...

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

Leandro Tuttini dijo...

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

carboy dijo...

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/

Jaume Estrany Mas dijo...

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.

Harold Molina dijo...

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

Leandro Tuttini dijo...

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

Irmuchiss A dijo...

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

Irmuchiss A dijo...

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

Leandro Tuttini dijo...

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

Irmuchis dijo...

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

Leandro Tuttini dijo...

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

Irmuchis dijo...

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

Leandro Tuttini dijo...

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

Irmuchis dijo...

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

Irmuchis dijo...

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

Leandro Tuttini dijo...

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

Irmuchis dijo...


Gracias Leandro, estoy revisando el link.

Saludos

Juanchope dijo...

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#

Leandro Tuttini dijo...

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

Juanchope dijo...

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

Gabriel Rodriguez dijo...

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

Leandro Tuttini dijo...

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

Blanca Sonia Delgado Ceballos dijo...

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.

Leandro Tuttini dijo...

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

david lalane lira dijo...

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?

Leandro Tuttini dijo...

hola david

podrias detectar esto que planteas desde javascript usando

window.onbeforeunload

Llamar funcion solo cuando oprima el boton cerrar


saludos

Willians Rodriguez dijo...

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

Leandro Tuttini dijo...

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

Willians Rodriguez dijo...

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:.
}

Willians Rodriguez dijo...

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 >");

Leandro Tuttini dijo...

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

Juan Manuel Dado dijo...

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

Stivenson Armero Kreisberger dijo...

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!!!

Leandro Tuttini dijo...

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

Leandro Tuttini dijo...

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

Juan Manuel Dado dijo...

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

Sergio Botta dijo...

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?

Sergio Botta dijo...

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

Leandro Tuttini dijo...

hola Sergio

podrias implementar algo como esto

[GridView] Javascript botón de eliminar con confirmación


saludos

Eduardo ortega dijo...

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.

angel dijo...

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

Leandro Tuttini dijo...

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

Leandro Tuttini dijo...

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

Chris dijo...

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

Leandro Tuttini dijo...

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

Chris dijo...

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.

Chris dijo...

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 :~

Leandro Tuttini dijo...

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

Franky dijo...

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.

Leandro Tuttini dijo...

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

Aldo Salazar dijo...

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

Leandro Tuttini dijo...

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

Carlos Ortiz dijo...

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);
}

Leandro Tuttini dijo...

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

Christian Ramirez Castillo dijo...

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

Leandro Tuttini dijo...

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

ivana conde dijo...

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

Leandro Tuttini dijo...

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

Ruben Hidalgo Alvarez dijo...

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.

Leandro Tuttini dijo...

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

eugerodriguez dijo...

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);

Leandro Tuttini dijo...

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