Pregunta

Tengo una página asp.net con un botón. Este botón genera e inserta un control de usuario en la página, por lo que muchos controles podrían existir en una página. Necesito validar que existe un cierto control generado dinámicamente dentro del control generado.

Entonces ... La página tiene 0 en N Control1 & # 8217; s. Cada Control 1 puede tener 0 en N Control2 & # 8217; s. Cuando se hace clic en SaveButton en la página, debo asegurarme de que haya al menos 1 Control2 & # 8217; s dentro de cada Control1.

Actualmente estoy entre dos opciones:

& # 8226; Inserte dinámicamente los CustomValidators para cada control que se genere, cada uno de los cuales validaría un Control1.

& # 8226; Haga la validación manualmente (con jQuery), llamando a una función de validación desde SaveButton.OnClientClick.

Ambos son descuidados a su manera & # 8211; Es por eso que estoy compartiendo esto con todos ustedes. ¿Me estoy perdiendo la solución fácil?

Gracias de antemano ... (por cierto & # 8211; cualquier cosa hasta .NET 3.5 SP1 incluido es un juego justo)

¿Fue útil?

Solución

Hmm, me gusta la idea de la interfaz sugerida por digiguru, pero usaría la interfaz en el contenedor Control1 en lugar de los sub controles, ya que parece ser el lugar más lógico para que viva el código. Heres mi opinión sobre él:

public interface IValidatableControl
{
    bool IsValidControl();    
}

luego implementa esto en tu Control1

public class Control1 : IValidatableControl
{
... Other methods
    public bool IsValidControl()
    {

        foreach(object c in this.Controls)
        {
            if(c.GetType() == "Control2")
                return true;
        }
        return false;
    }

}

Probablemente hay mejores formas de escribir esto, pero debería darle suficiente idea para comenzar.

Otros consejos

Si está agregando controles de usuario sobre la marcha, podría hacer que cada control implemente la misma interfaz con una función Validar. De esa manera, puede cargar los controles en un marcador de posición en cada control primario en la página. Cuando se envía la página, simplemente recorra los controles del marcador de posición, conviértalos a la clase de interfaz y luego llame a la función de validación. No uso validadores personalizados, pero puede crear una lista de errores de validación utilizando el objeto devuelto por la función de validación, puede procesar esta colección de errores de validación como desee.

Creo que podría hacerlo asignando una propiedad pública en Control1 que haga referencia a la existencia del ID de Control2, y luego decorar la clase de Control1 con ValidationProperty. Estoy pensando algo en este sentido:

[ValidationProperty("Control2Ref")]
public partial class Control1 : UserControl
{
    public string Control2Ref
    {
        get { return FindControl("Control2"); }
    }
    // rest of control 1 class
}

Y entonces deberías poder apuntar un RequiredFieldValidator a una instancia de Control1.

Un método que podría probar es crear y mantener una estructura xml simple que represente su jerarquía de control personalizada. Inserte o elimine de esta estructura cada vez que cree o destruya un control de usuario personalizado. Al guardar, valide que la jerarquía de control representada en la estructura xml sea correcta. Podría guardar el xml en el objeto Session para persistir en las devoluciones de datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top