sexta-feira, 22 de fevereiro de 2002

XML + Data Binding = Menos trabalho

Seguindo a linha do artigo anterior, podemos ligar alguns controle diretamente à elementos de um data island XML. Mas quem disse que esses elementos precisam ser read-only ?


No artigo anterior, colocamos um exemplo de uma hipotética listagem de nomes e telefones, indicando uma possível alternativa à criação de cada linha da tebla individualmente. Se você ainda não leu, leia antes de continuar este.


Caso precisássemos alterar os dados da tal lista, fatalmente cairíamos em um código como o abaixo:

<%
'...
response.write "<form method=""post"">"
response.write "<table>"
do while not rs.eof
   response.write " <tr><td>"
   'Criar um campo hidden com o ID, e dois campos: um para o nome e outro para o telefone
   response.write "<input name=""id_" & rs("id") & """ type=""hidden"" value=""" & rs("id") & """ />"
   response.write "<input name=""nome_" & rs("id") & """ type=""text"" value=""" & rs("nome") & """ />"
   response.write "</td><td>"
   response.write "<input name=""tel_" & rs("id") & """ type=""text"" value=""" & rs("telefone") & """ />"
   response.write "</td></tr>"
   rs.MoveNext
loop
response.write " <tr><td colspan=""2""><input type=""submit"" /></td></tr>"
response.write "</table>"
response.write "</form>"
%>

Como ficaria o código de leitura dos campos, quando este FORM fosse enviado ? Provavelmente teríamos um loop entre todos os itens da collection Request.Form. Se tivéssemos o azar de ter diversos campos, com características diferentes, seria um pouco mais problemático. Mas, como seria com data binding ?


Tomando como base a mesma rotina de criação de XML do artigo anterior, só precisariámos do seguinte:

<%
'... conexão do banco de dados e construção do documento XML
%>
<xml id="dsoLista"><%= oXMLDoc.xml %></xml>
<table datasrc="#dsoLista">
 <tr>
  <td><input type="text" datafld="nome" /></td>
  <td><input type="text" datafld="tel" /></td>
 </tr>
</table>
<xmp id="listagemXML"></xmp>

Tão logo um elemento seja alterado, o valor correspondente reflete tal alteração. Duvida ? Então acrescente o código:

<SCRIPT FOR="dsoLista" EVENT="oncellchange">
// Precisamos da pausa, pois quando este evento é disparado, a fonte de dados ainda não foi alterada
setTimeout( "listagemXML.innerText = dsoLista.xml", 50 )
</SCRIPT>

Caso você monte um documento pequeno, verá as mudanças acontecendo.


"Mas, e o ID ?"
Calma, para entender o por quê não colocamos referências ao ID, devemos entender o que está acontecendo. Estamos ligando controles a elementos de um data island (ou seja, fazendo um "data binding"). Quando alteramos um elemento, essa alteração automaticamente se reflete no data island. Então, da forma como estruturamos o XML, é desnecessário saber qual o ID. Eventualmente, poderíamos criar um elemento que representasse o estado de um registro, se ele foi alterado ou não. Aí as coisas ficam mais claras no ASP.


"Quais os elementos que suportam data binding ?" (Ctrl-C, Ctrl-V so site da MS)







































































































ElementUpdatableRenders HTMLBound Property
AFalseFalsehref
APPLETTrueFalseproperty value via PARAM
BUTTONFalseTrueinnerText, innerHTML
DIVFalseTrueinnerText, innerHTML
FRAMEFalseFalsesrc
IFRAMEFalseFalsesrc
IMGFalseFalsesrc
INPUT TYPE=BUTTONFalseTrueinnerText, innerHTML
INPUT TYPE=CHECKBOXTrueFalsechecked
INPUT TYPE=HIDDENTrueFalsevalue
INPUT TYPE=PASSWORDTrueFalsevalue
INPUT TYPE=RADIOTrueFalsechecked
INPUT TYPE=TEXTTrueFalsevalue
LABELFalseTrueinnerText, innerHTML
LEGENDFalseTrueinnerText, innerHTML
MARQUEEFalseTrueinnerText, innerHTML
SELECTTrueFalseobj.options(obj.selectedIndex).text
SPANFalseTrueinnerText, innerHTML
TEXTAREATrueFalsevalue

"Que vantagem Maria leva ?"
Bom, tendo um documento XML, as coisas são mais simples de pesquisar. Vamos supor que você precise consistir os dados entrados novamente no servidor (e sabemos o quanto isso é frequente). Você poderia pesquisar relacionamentos entre os dados do documento XML, ou caso queira sofisticar, criar um documento XML Schema que contenha as regras de como validar os dados e, com uma linha de código, eles seriam verificados, poupando código e deixando o mesmo mais simples de sofrer alterações (essas seriam feitas em apenas um lugar).


"Mas, eu vou precisar gerar um documento XML sempre ?"
Hummmm, mais ou menos. Quando pensamos em aplicações em n-tiers, há uma ampla gama de possibilidades retornadas pelo middle-tier para o ASP (o componente retorna informações que são tratadas no ASP). Por que não retornar as informações como uma string XML ? Pelo fato de estarmos utilizando um tipo de dado simples, a própria comunicação com o componente seria mais rápida e evitaríamos os problemas de tipagem de dados. Criando um middle-tier que retorna dados em formato XML, tornamos possível a reutilização deste código, uma vez que a base de aplicações que suporta XML não pára de crescer. Assim, em última análise, sempre deveríamos ter a transmissão de dados em um formato padrão, e, mais padrão que XML é difícil.. :)


"Ok, engraçadinho! E como fazer a aleteração dos dados ?"
Há duas possibilidades: a primeira é, no evento onsubmit do formulário que será retornado ao servidor, alimentarmos um elemento TEXTAREA com os dados do Data Island e reconstruirmos o objeto no servidor. Uma segunda, envolve os conceitos discutidos no artigo "Transferência de dados com XML + ASP", quando usamos o XMLHTTP para fazer a transferência do próprio objeto. A segunda é mais comum nas aplicações que desenvolvi recentemente, pois contamos com uma vantagem: a ausência de refresh. Podemos, desta forma, postar um conteúdo para o servidor, deixar que ele processe e aguardar uma resposta, indicando o status da operação, sem sair da página. Interessante, não ?


Por hoje é só pe-pessoal. Divirtam-se :)



Esta matéria foi postada originalmente no ASP4Developers por Rubens N. Farias (site), que na época era "pós-graduado em análise de sistemas orientados a objetos, MCP, MCSD, MCAD, MCSD.NET e consultor em TI, além de idealizador do projeto ASP4Developers. Desenvolve sistemas sob medida, focados na satisfação do usuário, com qualidade e custo realista.". Hoje, vai saber...

0 comentários: