none
Habilitar/Deshabilitar RequiredFieldValidator RRS feed

  • Pregunta

  • Estimados:

    Tengo un DropDownList que según sea el item elegido por el usuario se debe habilitar o deshabilitar un requiredfieldvalidator asociado a un cuadro de texto. Anteriormente lo he hecho del lado del cliente con javascript a través de la función ValidatorEnable(NombreControl, false) pero se presentó la necesidad de hacer algunas comprobaciones previas del lado del servidor que según el resultado definan el requerimiento de validación del cuadro de texto.

    En el Codebehind he intentado algo como esto:

                if (requerimiento = true)
                {
                    StringBuilder str1 = new StringBuilder();
                    str1.Append("<script language=\"javascript\" type=\"text/javascript\">" + Environment.NewLine);
                    str1.Append("function CondicionalTipoAlta(){" + Environment.NewLine);
                    str1.Append("var TelefonoContratoValidador = $get('" + rfvTelefonoContrato.ClientID + "');" + Environment.NewLine);
                    str1.Append("var TelefonoContrato = $get('" + txtTelefonoContrato.ClientID + "');" + Environment.NewLine);
                    str1.Append("ValidatorEnable(TelefonoContratoValidador, true) ;" + Environment.NewLine);
                    str1.Append("}" + Environment.NewLine);
                    str1.Append("</script>");
                    ScriptManager.RegisterStartupScript(this.Page, this.GetType(), "ReqTelefonoSI", str1.ToString(), true);
                }
                else
                {
                    StringBuilder str2 = new StringBuilder();
                    str2.Append("<script language=\"javascript\" type=\"text/javascript\">" + Environment.NewLine);
                    str2.Append("function CondicionalTipoAlta(){" + Environment.NewLine);
                    str2.Append("var TelefonoContratoValidador = $get('" + rfvTelefonoContrato.ClientID + "');" + Environment.NewLine);
                    str2.Append("var TelefonoContrato = $get('" + txtTelefonoContrato.ClientID + "');" + Environment.NewLine);
                    str2.Append("ValidatorEnable(TelefonoContratoValidador, false) ;" + Environment.NewLine);
                    str2.Append("}" + Environment.NewLine);
                    str2.Append("</script>");
                    ScriptManager.RegisterStartupScript(this.Page, this.GetType(), "ReqTelefonoNO", str2.ToString(), true);
                }

    Y como no funcionó, probé con esto:

                if (requerimiento = true)
                {
                    rfvTelefonoContrato.Enabled = true;
                }
                else
                {
                    rfvTelefonoContrato.Enabled = false;
                }

    Pero sigue sin funcionar =(

    Alguna sugerencia por favor?

    Saludos,

    Hector.

    sábado, 5 de marzo de 2011 23:22

Respuestas

  • hola

    el tema es que estas poniendo esta linea

    ValidatorEnable(TelefonoContratoValidador, false) ;

    dentro de una funcion de javascript CondicionalTipoAlta() que nucna ejecutas cuando lega al cliente, o al menos no veo popr ese codigo dinde lo haces

    porque no pones ese codigo fuera de la funcion, si usas jquery podrias definirlo dentro del

    $(document).ready (function() {
     
    });

     

    algo como ser

    $(document).ready(function() {
        var TelefonoContratoValidador = $get('" + rfvTelefonoContrato.ClientID + "');"
        var TelefonoContrato = $get('" + txtTelefonoContrato.ClientID + "');
        ValidatorEnable(TelefonoContratoValidador, true) ;
    });

     

    esto se se ejecutara a penas se cargue la pagina en el browser

     

    Nota recuerda que las funciones de javascripot no se ejecutan a menos que als invoques

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    sábado, 5 de marzo de 2011 23:55
  • Esta función de validación la ejecuto en los eventos RowDataBound y RowDeleting

    ahh ok esto esta dentro de un gridview, entonces la cosa cambia bastante

    intenta usando dentro del RowDataBound asignando el Enabled en false de cada requiredfieldvalidator  de cada row

    pero recuerda usar el

    RequiredFieldValidator rfv = e.Row.FindControl("requiredfieldvalidator1") as RequiredFieldValidator

    rfv.Enabled = false;

    o sea con esto buscas por cada fila del gridview aplciando la logica para deshabilitarlo, no hace falta hacer nada para habilitarlo ya que por default los estara, solo aplcia si necesitas quitar la validacion

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    domingo, 6 de marzo de 2011 4:42
  • Buenas tardes Leandro, al final resolví el problema con Enabled=True/False + un control UpdatePanel que actualiza asíncronamente la funcionalidad del validador.

    Gracias por todo el poyo,

    Saludos,

    Hector

    lunes, 7 de marzo de 2011 19:30

Todas las respuestas

  • hola

    el tema es que estas poniendo esta linea

    ValidatorEnable(TelefonoContratoValidador, false) ;

    dentro de una funcion de javascript CondicionalTipoAlta() que nucna ejecutas cuando lega al cliente, o al menos no veo popr ese codigo dinde lo haces

    porque no pones ese codigo fuera de la funcion, si usas jquery podrias definirlo dentro del

    $(document).ready (function() {
     
    });

     

    algo como ser

    $(document).ready(function() {
        var TelefonoContratoValidador = $get('" + rfvTelefonoContrato.ClientID + "');"
        var TelefonoContrato = $get('" + txtTelefonoContrato.ClientID + "');
        ValidatorEnable(TelefonoContratoValidador, true) ;
    });

     

    esto se se ejecutara a penas se cargue la pagina en el browser

     

    Nota recuerda que las funciones de javascripot no se ejecutan a menos que als invoques

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    sábado, 5 de marzo de 2011 23:55
  • Buenas noches Leandro:

    Ciertamente había pensado en lo que comentas, que alguien debe invocar la función pero no estaba muy seguro de cono hacerlo ya que la lógica de mi programa es que según el resultado de un comprobación en el SERVIDOR se dispare la función Javascript y según lo que me comentas he intentado esto:

                    StringBuilder str1 = new StringBuilder();
                    str1.Append("<script language=\"javascript\" type=\"text/javascript\">" + Environment.NewLine);
                    str1.Append("$(document).ready(function(){ " + Environment.NewLine);
                    str1.Append("var TelefonoContratoValidador = $get('" + rfvTelefonoContrato.ClientID + "');" + Environment.NewLine);
                    str1.Append("var TelefonoContrato = $get('" + txtTelefonoContrato.ClientID + "');" + Environment.NewLine);
                    str1.Append("ValidatorEnable(TelefonoContratoValidador, false);" + Environment.NewLine);
                    str1.Append("}" + Environment.NewLine);
                    str1.Append("</script>");
                    ScriptManager.RegisterStartupScript(this.Page, this.GetType(), "ReqTelefonoSI", str1.ToString(), true);

    Pero está claro que lo estoy haciendo mal, crees que haya forma de resolver mi problema pero reitero que de preferencia sea del lado del servidor? no es que la función del cliente tenga que estar activa todo el tiempo trabajando de la misma forma.

    Saludos,

    Hector.

    domingo, 6 de marzo de 2011 0:27
  • hola

    el tema es que con ese codigo activas o desactivas la validacion cuando esta este en el cliente, o sea desde el servidor decides si se activa o no, pero son dos tiempos separados, el servidor decide pero el cliente aplica la validacion y hace el postback o no segun pase la pase

    mi problema pero reitero que de preferencia sea del lado del servidor?

    lo que no entendi es cual es la logica que indica si debe aplciarse esa validacion o no ?

    podrias aplicar esto en la Page_Load para que active la validacion cuando la pagian se renderice en el cliente

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    domingo, 6 de marzo de 2011 0:56
  • Te explico, sucede que a través de una función en el servidor con un for each recorro las filas de un datatable ya que estas me dirán si es necesario o no la validación del telefono, entonces suponiendo que uno de los elementos de la grilla me indique que NO ES NECESARIA LA VALIDACIÓN DEL TELEFONO, al margen que las demás filas me digan que si es necesario, las ignoro y debo proceder a deshabilitar el requiredfieldvalidator .

    Esta función de validación la ejecuto en los eventos RowDataBound y RowDeleting (Por si se elimina una fila de la grilla), no sé si sea la mejor manera de resolver este requerimiento pero es la que se me ocurrió.

    Con todo lo que me has dicho he pensado en imprimir el resultado de la función de validacion en un control hidden y que sea la función javascript encargada de proceder según el valor resultante, voy a intentarlo y te cuento.

    Saludos,

    Hector.

    domingo, 6 de marzo de 2011 1:24
  • Sigo con el mismo problema, no tengo quien llame a la función Javascript , le puse a mi formulario un control TextBox que va cambiando su valor y supuse que dispararía en evento onChange pero esto solo funciona cuando los cambios son hechos por parte del usuario y no automaticamente como lo vengo haciendo, no sé que hacer =(
    domingo, 6 de marzo de 2011 3:10
  • Esta función de validación la ejecuto en los eventos RowDataBound y RowDeleting

    ahh ok esto esta dentro de un gridview, entonces la cosa cambia bastante

    intenta usando dentro del RowDataBound asignando el Enabled en false de cada requiredfieldvalidator  de cada row

    pero recuerda usar el

    RequiredFieldValidator rfv = e.Row.FindControl("requiredfieldvalidator1") as RequiredFieldValidator

    rfv.Enabled = false;

    o sea con esto buscas por cada fila del gridview aplciando la logica para deshabilitarlo, no hace falta hacer nada para habilitarlo ya que por default los estara, solo aplcia si necesitas quitar la validacion

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    domingo, 6 de marzo de 2011 4:42
  • Gracias por responder Leandro, nada! creo que has interpretado que tengo el requiredfieldvalidator por cada fila dentro de la grilla y no es así; como dije en el mensaje anterior:

    Tengo 1 RequiredFieldValidator asociado a 1 TextBox (Fuera de la grilla) que será activado/desactivado según la combinación de valores que pueda arrojar los items de la grilla, es decir si tengo 5 items de los cuales 4 definen que la obligatoriedad del textbox es necesaria y 1 item me dice que NO, ignoro a esos 4 y deberia desactivar el requiredfieldvalidator.

    Sé que suena un poco complicado pero ya sabes... cuando a los jefes se les da por pedir una cosa, como programadores solo nos resta buscarnos la vida con tal de obtener el resultado deseado.

    domingo, 6 de marzo de 2011 5:02
  • Perdona mi ignorancia Leandro pero me parece que la función: "$(document).ready(function()" se ejecuta incluso cuando la página genera llamadas asíncronas al servidor, puntualmente con los UpdatePanel?

    domingo, 6 de marzo de 2011 7:48
  • hola

    creo que has interpretado que tengo el requiredfieldvalidator por cada fila dentro de la grilla y no es así

    ahh ok si habia entendido que las validaciones estan en cada row de gridview

    en se caso la funciona para saber si se habilita o no lo tienes, en ese caso solo asigna el enbled en false cuando no sea necesario que este activo, si lo haces funciona ?

     

    se ejecuta incluso cuando la página genera llamadas asíncronas al servidor, puntualmente con los UpdatePanel?

    sino recuerdo mal deberia sera asi, si una accion de updatepanel invoca una funcion que devuleve javascript, ese seccion cuando llega el cliente se ejecuta

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    domingo, 6 de marzo de 2011 14:37
  • Buenas tardes Leandro, al final resolví el problema con Enabled=True/False + un control UpdatePanel que actualiza asíncronamente la funcionalidad del validador.

    Gracias por todo el poyo,

    Saludos,

    Hector

    lunes, 7 de marzo de 2011 19:30