¿La mejor manera de establecer globalmente la propiedad ValidationGroup de cada control en un asp.net?

StackOverflow https://stackoverflow.com/questions/1424577

  •  07-07-2019
  •  | 
  •  

Pregunta

Tengo un Control de usuario con elementos de formulario que se reutiliza considerablemente en una aplicación web grande, y hasta este momento, el resumen de validación sobre un envío de formulario no válido está siendo manejado por el .aspx que consume el Control de usuario.

Ahora necesito establecer la propiedad ValidationGroup en tiempo de ejecución para cada uno de mis controles de elementos de formulario (cuadros de texto, listas, validadores, etc.). En lugar de hacerlo manualmente configurando cada control, estoy interesado en iterar a través de todos los controles en el Control de usuario, detectar si ese control tiene una propiedad ValidationGroup y configurar su valor de esa manera.

Algo como esto:

For Each ctrl As System.Web.UI.Control In Me.Controls
   ' so now what is the proper way to detect if this control has the ValidationGroup property
Next

Ejemplo de código en vb.net o c # me funciona. Muchas gracias!

¿Fue útil?

Solución

Su UserControl debe exponer una propiedad que establece la propiedad ValidationGroup correctamente dentro de sí misma.

Control de marcado en .ASPX:

<ctl:yourcontrol id="whatever" runat="server" YourValidationGroupProp="HappyValidationName" />

Control de código subyacente .ASCX:

 protected override void OnPreRender(EventArgs e)
 {
     someControl.ValidationGroup = YourValidationGroupProp;
     someControl1.ValidationGroup = YourValidationGroupProp;
     someControl2.ValidationGroup = YourValidationGroupProp;
     //......etc
 }    

 public string YourValidationGroupProp{ get; set; }

Otros consejos

Cree un control personalizado heredando, por ejemplo, literal. Este control será de ayuda.

Lo insertará en una página, haga que haga todo el trabajo sucio por usted. p.ej. código de salida [que tomaría mucho tiempo escribir] basado en alguna lógica y una vez que haya terminado con él.

Obtenga ese código automático (lo que sería muy pesado para que otro control lo haya hecho en realidad cada vez), elimine el control auxiliar y coloque el nuevo código donde desee.

De esta forma, evita todos los errores al hacer que la computadora descubra el código que desea como desea y obtiene toda la velocidad codificada que sufriría al resolver el problema con un método genérico.

Estaba buscando lo mismo y de repente me sorprendió. Utilizo este método para otras cosas [escanear todos los controles & amp; generar algún código de inicio], ¡pero supongo que también podrías usar este método para hacerlo fácilmente!

Lo acabo de escribir y lo compartiré contigo

public class ValidationCodeProducerHelper : Literal
{
    // you can set this in the aspx/ascx as a control property
    public string MyValidationGroup { get; set; }

    // get last minute controls
    protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);

        // start scanning from page subcontrols
        ControlCollection _collection = Page.Controls;
        Text = GetCode(_collection).Replace("\r\n", "<br/>");
    }

    private string GetCode(Control _control)
    {
        // building helper
        StringBuilder _output = new StringBuilder();

        // the logic of scanning
        if (_control.GetType().GetProperty("ValidationGroup") != null && !string.IsNullOrEmpty(_control.ID))
        {
            // the desired code
            _output.AppendFormat("{0}.{1} = {2};", _control.ID, "ValidationGroup", MyValidationGroup);
            _output.AppendLine();
        }

        // recursive search within children
        _output.Append(GetCode(_control.Controls));

        // outputting
        return _output.ToString();
    }

    private string GetCode(ControlCollection _collection)
    {
        // building helper
        StringBuilder _output = new StringBuilder();
        foreach (Control _control in _collection)
        {
            // get code for each child
            _output.Append(GetCode(_control));
        }
        // outputting
        return _output.ToString();
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top