none
Contador dentro de Try-Catch RRS feed

  • Pregunta

  • try
                {
                    DataSet1TableAdapters.LoginTableAdapter obj = new DataSet1TableAdapters.LoginTableAdapter();
                    string nombreusuario = obj.Consulta_correo(txt_usuario.Text, txt_contraseña.Text).ToString();
                    string claveusuario = obj.Consulta_password(txt_usuario.Text, txt_contraseña.Text).ToString();

                    if (!nombreusuario.Equals(""))
                    {
                        Session["usuario"] = nombreusuario;
                        Session["clave"] = claveusuario;
                        Response.Redirect("Aplicacion.aspx");
                    }

                }

                catch (Exception)
                {
                    int intentos=3;

                    if (intentos == 0)
                    {
                        Label1.Text = "Usuario Bloqueado " + intentos;
                        txt_contraseña.Enabled = false;
                        txt_usuario.Enabled = false;

                    }
                    else
                    {
                        intentos--;
                        Label1.Text = "Usuario o Clave Incorectos " + intentos;
                        txt_usuario.Focus();
                        txt_contraseña.Text = "";
                    }

                }

    aquí les pongo el código el problema que tengo es con el contador "intentos" lo que quiero con el es que al llegar a 0 envie el mensaje de "usuario bloqueado" llega hasta 2 de ahi no pasa se queda en ese numero espero que me puedan ayudar gracias 

                                                                            
    jueves, 31 de marzo de 2016 6:55

Respuestas

  • hola

    Imagino cada intento es un post diferente, no se en que contexto pones ese codigo, imagino esta en el click de algun boton

    pero recuerda que las variables no conservan estado entre post, por lo que tienes que usar el objeto Session o ViewState

    public void Page_Load(..)
    {
    	if(!IsPostBack)
    	{
    		ViewState["intentos"] = 3;
    	}
    }
    
    public void button1_Click(..)
    {
    	try
    	{
    		DataSet1TableAdapters.LoginTableAdapter obj = new DataSet1TableAdapters.LoginTableAdapter();
    		string nombreusuario = obj.Consulta_correo(txt_usuario.Text, txt_contraseña.Text).ToString();
    		string claveusuario = obj.Consulta_password(txt_usuario.Text, txt_contraseña.Text).ToString();
    
    		if (!nombreusuario.Equals(""))
    		{
    			Session["usuario"] = nombreusuario;
    			Session["clave"] = claveusuario;
    			Response.Redirect("Aplicacion.aspx");
    		}
    
    	}
    
    	catch (Exception)
    	{
    		int intentos = Convert.ToInt32(ViewState["intentos"]);
    		
    		if (intentos == 0)
    		{
    			Label1.Text = "Usuario Bloqueado " + intentos;
    			txt_contraseña.Enabled = false;
    			txt_usuario.Enabled = false;
    
    		}
    		else
    		{
    			intentos--;
    			Label1.Text = "Usuario o Clave Incorectos " + intentos;
    			txt_usuario.Focus();
    			txt_contraseña.Text = "";
    		}
    		
    		ViewState["intentos"] = intentos;
    		
    	}
    }

    de esta forma entre postback podras validar la cantidad de intentos

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Propuesto como respuesta José De AlvaModerator jueves, 31 de marzo de 2016 20:58
    • Marcado como respuesta Sbarcas viernes, 1 de abril de 2016 6:51
    jueves, 31 de marzo de 2016 12:34

Todas las respuestas

  • El problema es que has declarado la variable intentos DENTRO del catch. Por lo tanto es una variable local y se vuelve a inicializar a 3 cada vez que se entra al catch.

    En C# no ocurre como en javascript que se produce un "hoisting" y la variable es local al método. Para que la variable perdure de una vez a la siguiente, tienes que sacarla fuera del "catch" y darle un alcance que permita que se mantenga la variable creada entre invocaciones del bloque de código que la usa (que posiblemente sea a nivel de método o tal vez a nivel de clase, dependiendo de cómo esté hecho el resto de tu código).

    jueves, 31 de marzo de 2016 8:11
  • hola

    Imagino cada intento es un post diferente, no se en que contexto pones ese codigo, imagino esta en el click de algun boton

    pero recuerda que las variables no conservan estado entre post, por lo que tienes que usar el objeto Session o ViewState

    public void Page_Load(..)
    {
    	if(!IsPostBack)
    	{
    		ViewState["intentos"] = 3;
    	}
    }
    
    public void button1_Click(..)
    {
    	try
    	{
    		DataSet1TableAdapters.LoginTableAdapter obj = new DataSet1TableAdapters.LoginTableAdapter();
    		string nombreusuario = obj.Consulta_correo(txt_usuario.Text, txt_contraseña.Text).ToString();
    		string claveusuario = obj.Consulta_password(txt_usuario.Text, txt_contraseña.Text).ToString();
    
    		if (!nombreusuario.Equals(""))
    		{
    			Session["usuario"] = nombreusuario;
    			Session["clave"] = claveusuario;
    			Response.Redirect("Aplicacion.aspx");
    		}
    
    	}
    
    	catch (Exception)
    	{
    		int intentos = Convert.ToInt32(ViewState["intentos"]);
    		
    		if (intentos == 0)
    		{
    			Label1.Text = "Usuario Bloqueado " + intentos;
    			txt_contraseña.Enabled = false;
    			txt_usuario.Enabled = false;
    
    		}
    		else
    		{
    			intentos--;
    			Label1.Text = "Usuario o Clave Incorectos " + intentos;
    			txt_usuario.Focus();
    			txt_contraseña.Text = "";
    		}
    		
    		ViewState["intentos"] = intentos;
    		
    	}
    }

    de esta forma entre postback podras validar la cantidad de intentos

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Propuesto como respuesta José De AlvaModerator jueves, 31 de marzo de 2016 20:58
    • Marcado como respuesta Sbarcas viernes, 1 de abril de 2016 6:51
    jueves, 31 de marzo de 2016 12:34
  • Muchísimas gracias por tu ayuda Leandro quedo excelente 
    viernes, 1 de abril de 2016 6:53