Momento POG: Submetendo Textboxes Readonly alterados via JavaScript
Em vários momentos precisamos inibir a edição de algumas caixas de texto pelo usuário, seja que ela sirva somente para apresentação de um valor que vem diretamente da base de dados ou que apresente o resultado de uma pesquisa iniciada em outra página.
Para que o segundo motivo seja possível de ser feito, é necessário que uma rotina JavaScript altere o valor desta caixa de texto. Imagine o seguinte cenário:
- Página principal tem um campo onde se precisa informar dados de um veículo previamente cadastrado no sistema, sendo este campo bloqueado para edição manual e há um botão de pesquisa que abre uma janela pop up.
- Página pop up onde é feita uma pesquisa por um registro; clicando-se neste registro o campo da janela principal é alterado.
Se tratando de código, é algo mais ou menos assim:
Página Principal:
1: <asp:TextBox runat="server" id="tbxDadosVeiculo" ReadOnly="True"></asp:TextBox>
Página Pop Up, aberta pela página Principal:
1: protected void SelecionaRegistro_Click(object sender, EventArgs e)
2: {
3: string script = "window.opener.getElementById(\"tbxDadosVeiculo\").value = " + "'" + getDadosVeiculo(...) + "'";
4: ClientScript.RegisterStartupScript(this.GetType(),"populaprincipal",script);
5: }
O código do pop up é simples. Ele apenas registra uma rotina JavaScript, fazendo com que um textbox da página principal seja alterado.
Porém, ao submeter o formulário da página principal, o valor colocado pelo JavaScript na janela pop up ou outro script da mesma página no textbox é perdido.
Isto acontece por causa de uma política de segurança do .NET Framework 2.0, em que valores de componentes de interface com o atributo somente leitura no servidor não sejam postados, perdendo-se nesta operação.
Mas, graças também ao JavaScript e a POG a seguir podemos fazer com que a caixa de texto fique somente-leitura, porém poste seu conteúdo para o servidor. Siga os passos:
- Deixe o atributo ReadOnly da tag de servidor em False.
- Registre o atributo readOnly na tag HTML do cliente, com o seguinte código no evento PageLoad do formulário web:
1: tbxDadosVeiculo.Attributes.Add("readOnly","true");
onde tbxDadosVeiculo é o textbox que será alterado via JavaScript.
Isto fará com que o servidor não tome conhecimento de que esta caixa de texto é somente leitura, dê um “bypass” na política de segurança e o conteúdo do textbox permaneça após os postbacks.
Um abraço!
0 comentários:
Postar um comentário