Pergunta

Eu tenho uma página asp.net com um botão. Este botão gera e insere um controle de usuário na página, tantos controles poderia existir em uma página. Eu preciso para validar que um certo controle gerados dinamicamente dentro do controle gerado existe.

So..Page tem 0 a N Control1 de. Cada controlo 1 pode ter 0 a N Control2 de. Quando SaveButton é clicado na página, eu preciso certificar-se de que há pelo menos 1 Control2 de dentro de cada Control1.

Atualmente estou entre duas opções:

• inserir dinamicamente CustomValidators para cada controle que é gerado, cada um dos quais seria validar um Control1.

• Faça a validação manualmente (com jQuery), chamando uma função de validação de SaveButton.OnClientClick.

Ambos são desleixado em sua própria maneira - e é por isso que estou compartilhando isso com todos vocês. Estou faltando a solução fácil?

Agradecemos antecipadamente .. (BTW - qualquer coisa até e incluindo .NET 3.5 SP1 é um jogo justo)

Foi útil?

Solução

Hmm Eu gosto da idéia de interface sugerida por digiguru mas eu gostaria de usar a interface no recipiente Control1 em vez dos controles sub como parece que o lugar mais lógico para o código para viver. Heres minha opinião sobre ele:

public interface IValidatableControl
{
    bool IsValidControl();    
}

, em seguida, implementar isso em seu Control1

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

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

}

Existem provavelmente melhores maneiras de escrever isso, mas deve dar-lhe o suficiente de uma idéia para começar.

Outras dicas

Se você estiver adicionando controles de usuário em tempo real, você poderia fazer cada controle implementar a mesma interface com uma função Validar. Dessa forma, você pode carregar os controles em um espaço reservado em cada controle pai na página. Quando a página é enviada, simplesmente percorrer os controles no espaço reservado, lançá-los à classe interface e, em seguida, chamar a função de validação. Eu não usar validadores personalizados, mas você pode construir uma lista de erros de validação usando o objeto retornado da função de validação, você pode tornar esta coleção de erros de validação do jeito que você gosta.

Eu acho que você poderia fazê-lo através da atribuição de uma propriedade pública em Control1 que as referências a existência de ID do Control2, em seguida, decorar a classe de Control1 com ValidationProperty. Estou pensando em algo ao longo destas linhas:

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

E, em seguida, você deve ser capaz de apontar um RequiredFieldValidator em uma instância de Control1.

Um método que você pode tentar é criar e manter uma estrutura xml simples que representa a hierarquia de controle personalizado. Inserir ou excluir essa estrutura toda vez que você criar ou destruir um controle de usuário personalizada. Após a salvar, validam que a hierarquia de controle representado na estrutura XML é correcta. Você poderia salvar o xml no objeto Session persistir lo em postagens.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top