Melhor maneira de definir globalmente propriedade ValidationGroup de cada controle em um asp.net?

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

  •  07-07-2019
  •  | 
  •  

Pergunta

Eu tenho um usuário de controle com itens de formulário que é consideravelmente ao longo de uma aplicação web grande reutilizado, e até este ponto o resumo de validação em cima de um envio de formulário inválido está sendo tratado pelo aspx que consome o User Control.

Agora eu preciso para definir a propriedade ValidationGroup em tempo de execução para cada um dos meus itens de formulário controles (caixas de texto, listas, validadores, etc). Em vez de fazê-lo manualmente, definindo cada controle Estou interessado na iteração por todos os controles no User Control, detectar se que o controle tem uma propriedade ValidationGroup, e defini-lo do valor dessa forma.

Algo parecido com isto:

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

Exemplo de código em vb.net ou c # funciona para mim. Muito obrigado!

Foi útil?

Solução

Seu UserControl deve expor uma propriedade que define a propriedade ValidationGroup adequadamente dentro de si.

Markup Controle em .ASPX:

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

Código-behind .ASCX controle:

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

 public string YourValidationGroupProp{ get; set; }

Outras dicas

Criar um herdar o controle personalizado, por exemplo, literal. Este controle será um ajudante.

Você vai inseri-lo em uma página, tem que fazer todo o trabalho sujo para você. por exemplo. código de saída [que levaria muito tempo para escrever] com base em alguma lógica e uma vez que você é feito com ele.

Get que automática de código (o que seria de peso pesado de ter que foi realmente feito cada vez por um outro controle), remover o controle auxiliar e hard-code-lugar o novo código onde quer que você deseja.

Desta forma você evitar todos os erros através de ter a figura de computador o código que você quer como desejo e você ganha toda a velocidade hard-coded que sofreria, resolvendo o problema com método genérico.

Eu estava na busca da mesma coisa e, de repente, me surpreendeu. I utilizar este método para outras coisas [verificar todos os controles e saída de algum código de inicialização], mas eu acho que você poderia usar esse método para fazer isso facilmente, bem!

Eu apenas escrevi e eu vou compartilhar com você

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top