Sharepoint – Assegurando o funcionamento de Ajax em Webparts
09/05/2010 Deixe um comentário
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


