none
Validação de dados usando popup RRS feed

  • Pergunta

  • Tenho uma página inicial que exibe os dados dos clientes cadastrados em um gridview, nessa página tenho tb um botão para iniciar o cadastro de um novo cliente.

    Ao clicar nesse botão é aberta uma popup com os campos para realizar o cadastro. Essa popup foi criada através de um ModalPopupExtender (ajaxtoolkit), que nada mais é do que um PANEL com os campos desejados e para abrir utilizo o comando: ModalPopupExtender.Show()

    Até esse ponto está tudo funcionando corretamente, depois de abrir a popup e informar os dados o usuário clica na opção salvar e a rotina de inclusão no banco SQL é executada.

    O problema está quando o usuário não preenche todos os dados e a rotina entra no controle de erros (validação) informando que o campo é obrigatório. Mas quando isso é feito o PANEL é encerrado ao invés de permanecer aberto para o usuário preencher o campo, alguém utiliza esse esquema de popup para realizar inclusão ou alteração de dados? Alguma sugestão de como manter esse panel aberto depois da validação?

    Código fonte:

            protected void btnSalvar_Click(object sender, EventArgs e)
            {
                if (txtQtde.Text == string.Empty)
                {
    ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "my-msg", "alert('Os dados foram registrados com sucesso.')", true);
                    txtQtde.Focus();
                    return;
                }

                Model_Clientes oMod = new Model_Clientes ();
                oMod.Nome = txtNome.text;
                oMod.Rg = int.Parse(Session["Cli_oid"].ToString());
                oMod.Cpf = txtCpf.Text;
                oMod.Telefone = txtTelefone.Text;
                oMod.Qtd = txtQtde.Text;

                Dal_Clientes obj = new Dal_Clientes();
                obj.Inserir(oMod);

                carregaGridClientes(int.Parse(Session["K100_oid"].ToString()));
                ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "my-msg", "alert('Os dados foram registrados com sucesso.')", true);

                LimpaDados();

            }


    terça-feira, 5 de abril de 2016 18:02

Respostas

  • Consegui resolver o problema, na verdade não acho que foi a solução ideal mas funciona perfeitamente.

    Com a alteração, dentro do tratamento de erro eu executo novamente o comando para exibição do popup:

    if (txtQtde.Text == string.Empty)
    {
        ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "my-msg", "alert('Campo obrigatório.')", true);	
        txtQtde.Focus();
        this.ModalPopupExtender.Show();
        return;
    }

    Com a solução acima, após a exibição da mensagem de alerta o popup é forçado a ser exibido novamente.

    Pesquisei bastante sobre o assunto e a sugestão de várias pessoas é de inserir um UpdatePanel dentro do Panel, desta forma o Postback não seria executado e o fechamento do popup ao clicar em qualquer botão da tela seria evitado. Tentei implementar essa solução mas tb não deu certo, continuou do mesmo jeito, por isso neste momento vou utilizar a solução de chamar novamente o popup.

    Vou tentar uma solução mais inteligente quando tiver um tempo sobrando, por enquanto deu certo mas fiquei com aquela sensação de gambiarra.

    terça-feira, 5 de abril de 2016 19:58

Todas as Respostas

  • Boa tarde Jefferson!

    Tem post que dou uma dica para não dar resposta de cara e a pessoa treinar um pouco a lógica, mas vamos lá: 

    Porque você não pensa dessa seguinte maneira, enquanto o campo estiver nulo ele gera a mensagem de erro. Então você usa um laço(While) ou coloca tudo dentro de um While, e dentro do seu if você modifica o valor de uma variável do tipo bool, ai você escolhe, ele só sai do while se for verdadeiro ou diferente de verdadeiro. 

    Entendeu a lógica? Tenta implementar essa ideia, qualquer dúvida volta que a gente mostra outra dica de como seria no seu código isso. 

    At.te,



    • Editado Open Study terça-feira, 5 de abril de 2016 18:39
    terça-feira, 5 de abril de 2016 18:37
  • Mas o problema não está na lógica de como controlar o erro, essa parte pode realmente ser implementada de várias maneiras diferentes, inclusive a que vc sugeriu.

    O problema está no fato do ModalPopupExtender gerar um Postback sempre que for clicado em qualquer botão existente nesse popup, encerrando a tela sem validar os campos obrigatórios.

    Acredito que vc não tenha entendido muito bem o problema, de qualquer forma, muito obrigado.

    terça-feira, 5 de abril de 2016 19:41
  • Consegui resolver o problema, na verdade não acho que foi a solução ideal mas funciona perfeitamente.

    Com a alteração, dentro do tratamento de erro eu executo novamente o comando para exibição do popup:

    if (txtQtde.Text == string.Empty)
    {
        ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "my-msg", "alert('Campo obrigatório.')", true);	
        txtQtde.Focus();
        this.ModalPopupExtender.Show();
        return;
    }

    Com a solução acima, após a exibição da mensagem de alerta o popup é forçado a ser exibido novamente.

    Pesquisei bastante sobre o assunto e a sugestão de várias pessoas é de inserir um UpdatePanel dentro do Panel, desta forma o Postback não seria executado e o fechamento do popup ao clicar em qualquer botão da tela seria evitado. Tentei implementar essa solução mas tb não deu certo, continuou do mesmo jeito, por isso neste momento vou utilizar a solução de chamar novamente o popup.

    Vou tentar uma solução mais inteligente quando tiver um tempo sobrando, por enquanto deu certo mas fiquei com aquela sensação de gambiarra.

    terça-feira, 5 de abril de 2016 19:58