Sharepoint – Assegurando o funcionamento de Ajax em Webparts

Muitas vezes ao construirmos webparts sentimos a necessidade de tornarmos seu funcionamento mais “amigável” e favorável a utilização do usuário, agregando recursos baseados em Ajax.

Na grande maioria das ocasiões costumo utilizar os recursos presentes no conjunto de componentes Ajax Extensions, tais como ScriptManager, UpdatePanel e Timer.

Alguns controles nativos do ASP.Net utilizam a função JavaScript _doPostBack() para garantir o commit de suas alterações, mas o WSS 3.0 e o ASP.Net Ajax acabam armazenando em cache certas ações da página. Esse tipo de execução acaba causando conflitos entre o Sharepoint e o ASP.Net Ajax, para resolver tais conflitos costumo utilizar o código abaixo para restaurar o comportamento padrão dos eventos do formulário dentro das páginas:

private void EnsureASPNetAjax()
{
if (this.Page.Form != null)
{
String fixupScript = @”
_spBodyOnLoadFunctionNames.push(“”_initFormActionAjax””);
function _initFormActionAjax()
{
if (_spEscapedFormAction == document.forms[0].action)
{
document.forms[0]._initialAction =
document.forms[0].action;
}
}
var RestoreToOriginalFormActionCore =
RestoreToOriginalFormAction;
RestoreToOriginalFormAction = function()
{
if (_spOriginalFormAction != null)
{
RestoreToOriginalFormActionCore();
document.forms[0]._initialAction =
document.forms[0].action;
}
}”;
ScriptManager.RegisterStartupScript(this,
typeof(SolicitacaoCaderno), “UpdatePanelFixup”,
fixupScript, true);
}
}

Mais detalhes no link http://msdn.microsoft.com/en-us/library/bb861877.aspx

Outro ponto interessante é o comportamento “preguiçoso” do controle UpdatePanel, que em determinados momentos funciona corretamente durante a transição do primeiro post e depois para de atualizar seu conteúdo por inteiro… Isto é, o UpdatePanel executa a primeira atualização e depois para de funcionar, para resolver esse problema costumo utilizar o bloco abaixo (que aliás, nunca me deixou na mão):

private void EnsureUpdatePanelFixups()
{
if (this.Page.Form != null)
{
string formOnSubmitAtt = this.Page.Form.Attributes[“onsubmit”];
if (formOnSubmitAtt == “return _spFormOnSubmitWrapper();”)
{
this.Page.Form.Attributes[“onsubmit”] = “_spFormOnSubmitWrapper();”;
}
}
ScriptManager.RegisterStartupScript(this, typeof(SolicitacaoCaderno),
“UpdatePanelFixup”,
“_spOriginalFormAction = document.forms[0].action; _spSuppressFormOnSubmitWrapper=true;”,
true);
}

Costumo fazer chamadas a estes eventos dentro do evento OnInit ou Load da Webpart

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.

Junte-se a 70 outros seguidores