TDC 2013

quarta-feira, 30 de setembro de 2009

Habilitar campo texto com JavaScript e C#

Devem estar se perguntando qual a necessidade disso se pode ser feito direto pelo código sem a intervenção via javascript (js).
Realmente, em um caso normal não tem a necessidade de usar o js para esse tipo de alteração de atributo. Mas vamos imaginar o seguinte caso:

Você tem uma página principal (WebForm) onde existe o campo cidade em um componente textbox, no qual o valor será passado por um popup que trará uma pesquisa onde será selecionado a cidade e na sequência ao fechar esse popup estará no campo mencionado o valor da cidade.
Até esse ponto, está tudo normal ao selecionar o registro no popup você estará chamando um bloco parecido com esse:

String sString = "";
sString = "window.opener.document.forms(0).txtCidade.value = '" + cidade + "';";
sString += "window.opener.document.forms(0).submit();";
sString += "self.close();";
ClientScript.RegisterClientScriptBlock(this.GetType(), "OK", sString, true);


A coisa começa a complicar quando o campo cidade "deve" esta em readOnly. Nesse caso o trecho acima não faz o menor efeito.
Teoricamente podemos incluir no trecho o pedido para deixar o textbox sem readOnly e após incluir o campo voltando para tal:

String sString = "";
sString = "
window.opener.document.forms(0).txtCidade.readonly = false;";
sString += "window.opener.document.forms(0).txtCidade.value = '" + cidade + "';";
sString += "window.opener.document.forms(0).txtCidade.readonly = true;";
sString += "window.opener.document.forms(0).submit();";
sString += "self.close();";
ClientScript.RegisterClientScriptBlock(this.GetType(), "OK", sString, true);


Mesmo desse jeito citado acima não funcionaria, pois em cima da especificação de segurança usada pela framework da microsoft (2.0 em diante) uma vez o campo definido na tag como readOnly não é possível a sua edição.

Mas existe uma maneira de driblar essa segurança. Vale informar que isso não é recomendado pela Microsoft, pois justamente se existe esse bloqueio e para evitar uma brecha de segurança. Mas mesmo ciente dos risco, quiser utilizar, siga os seguintes passos:

  1. Deixe o componente textbox com a opção readonly como false.
  2. No Page_Load inclua o seguinte atributo "txtCidade.Attributes.Add("readOnly", "true");" (sem as aspas)
  3. Utilize o segundo trecho de código informado acima.
Dessa forma estará inserindo o valor no campo e deixando ele novamente como readOnly.

Nenhum comentário:

Postar um comentário