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