pontoNETpt
A comunidade PontoNetPT está direccionada a todos os programadores que trabalhem com a plataforma .NET.
KISS AJAX :)

Enquanto lia e relia, e relia, e relia.... todos os samples do Ajax.Net dei por mim a pensar de que outras formas poderia resolver este problema que o par http/html nos coloca em termos de construção de interfaces. Que regra geral se resume a algo como: só pq precisamos de algum feedback do servidor obrigamos o browser a receber novamente todo o html da página.

Ora bem...o asp.net é uma caixinha de possibilidades :) , vai daí.... e fazendo uso desta pequena maravilha feita quase de encomenda (autoria de Bill Pierce) , do reflector, alguma (bastante) preguiça, muito copy paste,pouco sono, e da curiosidade natural sobre se isto poderia afinal resultar... em pouco mais de meia hora saiu o seguinte código. 

(Obviamente isto foi apenas uma prova de conceito.... de sustentabilidade muito duvidável,... mas vejam lá se descobrem o que isto faz, palavra de honra que está a funcionar :) ).

PS-yeaps, funciona tb com datagrids, tirando o pormenor de o elemento html da grid ter que existir antes do postback ajax, nada que um painel não resolva.

namespace TestRoot
{
    /// 
    /// KISS AJAX Sample, Rui Quintino 2005
    /// 
    public class WebForm1 : System.Web.UI.Page
    {
        protected System.Web.UI.WebControls.DropDownList DropDownList1;
        protected System.Web.UI.WebControls.Label Label1;
        protected System.Web.UI.WebControls.LinkButton LinkButtonAdd;
        protected System.Web.UI.WebControls.LinkButton LinkButtonChoose;
        protected System.Web.UI.WebControls.Label lblData;
        

(Web Form Designer generated code...)

private ArrayList changedControls= new ArrayList();


private bool IsAjaxRequest { get { return Request.QueryString["ajaxRequest"]!=null ; } }
private string EscapeJavascript(string jsString) { System.Text.StringBuilder escJs= new System.Text.StringBuilder(jsString); escJs.Replace("\r\n",""); escJs.Replace("\n",""); escJs.Replace("\t",""); escJs.Replace("'","''"); return escJs.ToString(); }
private void Page_Load(object sender, System.EventArgs e) { LinkButtonAdd.Attributes.Add("onclick","AjaxPostBack(this);return false;");
lblData.Text=DateTime.Now.ToString(); } private void ButtonAdd_Click(object sender, System.EventArgs e) { int nItem=DropDownList1.Items.Count; DropDownList1.Items.Add( new ListItem("Item "+nItem.ToString()+
" em "+DateTime.Now.ToString(),nItem.ToString()));
changedControls.Add(DropDownList1); } public override void VerifyRenderingInServerForm(Control ctl) { //Ignora } protected override void Render(HtmlTextWriter html) { if (IsAjaxRequest ) { foreach (WebControl ctl in changedControls) { System.IO.StringWriter sw= new System.IO.StringWriter(); HtmlTextWriter ht= new HtmlTextWriter(sw); ctl.RenderControl(ht); Response.Write(
string.Format("document.getElementById('{0}').outerHTML='{1}';", ctl.ClientID,EscapeJavascript( sw.ToString()))); }
} else base.Render(html); }
protected override void SavePageStateToPersistenceMedium(object viewState) { if (IsAjaxRequest) { System.Reflection.FieldInfo los=typeof(Page).GetField("_formatter",
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.GetField |
System.Reflection.BindingFlags.Instance); LosFormatter l=(LosFormatter) los.GetValue(this); System.IO.StringWriter viewStateStr= new System.IO.StringWriter(); l.Serialize(viewStateStr,viewState); Response.Write(
string.Format("document.getElementById('__VIEWSTATE').value='{0}';", viewStateStr.ToString()));
} else base.SavePageStateToPersistenceMedium(viewState); }
private void ButtonChoose_Click(object sender, System.EventArgs e) { if (DropDownList1.SelectedItem!=null) { Label1.Text="Opcao escolhida: "+DropDownList1.SelectedItem.Text; } } } }

Posted 5-6-2005 4:39 por Rui Quintino
Filed under:

Comments

Anonymous wrote re: KISS AJAX :)
on 1-7-2009 1:38
Sem querer desvendar mto :)....claro que o passo a seguir era migrar quase todo o codigo para uma classe base, ficaríamos assim com uma página normalíssima apenas com estas linhas "extra":

SetAjaxPostBackButton(btnXpto);
changedControls.Add(ctlXpto);

A isto acrescenta-se obviamente as funções javascript utilitárias que tratam do xmlhttp (que copiei do tal artigo que menciono em cima).
Anonymous wrote re: KISS AJAX :)
on 2-7-2009 1:58
Sem querer desvendar mto :)....claro que o passo a seguir era migrar quase todo o codigo para uma classe base, ficaríamos assim com uma página normalíssima apenas com estas linhas "extra":

SetAjaxPostBackButton(btnXpto);
changedControls.Add(ctlXpto);

A isto acrescenta-se obviamente as funções javascript utilitárias que tratam do xmlhttp (que copiei do tal artigo que menciono em cima).

Add a Comment

(requerido)  
(opcional)
(requerido)  
Remember Me?
If you can't read this number refresh your screen
Enter the numbers above:  
Powered by Community Server (Commercial Edition), by Telligent Systems