As informações neste artigo são coletadas de muitas fontes, portanto não posso listá-las todas. O conteúdo é apenas para gerenciamento de conhecimento pessoal.
O Windows SharePoint Services v3 é baseado no ASP.NET 2.0. O Microsoft ASP.NET AJAX 1.0 foi lançado após o MOSS, portanto, em alguns casos, há alguns problemas de compatibilidade entre o ASP.NET AJAX e o SharePoint, que serão resolvidos no Windows SharePoint Services SP1. Antes disso, o uso da tecnologia ASP.NET AJAX no SharePoint exigia algumas etapas especiais de implantação.
Nota:
Existem restrições ao uso do UpdatePanel na webpart. Por favor, verifique a documentação do ASP.NET AJAX para obter detalhes. Nem todos os controles podem ser usados no UpdatePanel.
Se o cache de saída estiver habilitado, você não poderá usar o ASP.NET AJAX ou ocorrerá um erro. A contradição clássica entre desempenho e oportunidade.
Benefícios de usar a tecnologia Microsoft ASP.NET AJAX 1.0 no SharePoint:
Uma biblioteca completa de recursos de script de cliente pode ser formada e alguns componentes reutilizáveis podem ser acumulados.
Nossos dados de serviço da web podem ser exibidos usando JSON e os resultados podem ser facilmente usados em aplicativos JavaScript/Ajax.
Construir WebParts usando a tecnologia em extensões pode fornecer estilos altamente interativos, como uma caixa de texto com funcionalidade de preenchimento automático.
Use UpdatePanel no WebPart para obter interação sem retorno de chamada e reduzir o número de atualizações de página.
A seguir estão as etapas de preparação do ambiente antes de implantar componentes que usam a tecnologia Microsoft ASP.NET AJAX 1.0. (Você só precisa implantá-lo uma vez no ambiente recém-instalado e não precisará adicionar o Webpart posteriormente)
Baixe e instale o ASP.NET AJAX no farm de servidores da web
Primeiro, você deve instalar "ASP.NET 2.0 AJAX Extensions 1.0. ", que pode ser baixado em download ajax.asp .net.
Estendendo o web.config do SharePoint para Microsoft ASP.NET AJAX 1.0
Precisamos registrar algumas entradas específicas para Ajax. Edite o arquivo web.config do SharePoint, que geralmente está localizado no seguinte diretório:
c:inetpubwwwrootwssvirtualdirectories80
Adicione o elemento <sectionGroup> à tag <configSections>: <configSections>
<sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Versão=1.0.61025.0, Culture=neutro, PublicKeyToken=31bf3856ad364e35">
<sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Versão=1.0.61025.0, Culture=neutro, PublicKeyToken=31bf3856ad364e35">
<section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication"/>
<sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Versão=1.0.61025.0, Culture=neutro, PublicKeyToken=31bf3856ad364e35">
<section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="Everywhere" />
<section name="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication" />
<section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication" />
</sectionGroup>
</sectionGroup>
</sectionGroup>
</configSections>
Adicione o conteúdo da seção <controls> nas tags <system.web>/<pages>. <páginas>
<controles>
<add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Versão=1.0.61025.0, Cultura=neutro, PublicKeyToken=31bf3856ad364e35"/>
</controls>
</páginas>
Adicione o seguinte conteúdo na tag <assemblies> dentro da tag <compilation>: <assemblies>
<add assembly="System.Web.Extensions, Versão=1.0.61025.0, Culture=neutro, PublicKeyToken=31bf3856ad364e35"/>
</assemblies>
Adicione o seguinte conteúdo na seção <httpHandlers>: <httpHandlers>
<add verbo="*" path="*.asmx" validar="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Versão=1.0.61025.0, Culture=neutro, PublicKeyToken= 31bf3856ad364e35"/>
<add verbo="*" path="*_AppService.axd" validar="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Versão=1.0.61025.0, Culture=neutral, PublicKeyToken =31bf3856ad364e35"/>
<add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Versão=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validar=" falso"/>
</httpHandlers>
Adicione o seguinte conteúdo de registro na seção HttpModules, abaixo de todo o conteúdo de registro existente <httpModules>
<add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Versão=1.0.61025.0, Culture=neutro, PublicKeyToken=31bf3856ad364e35"/>
</httpMódulos>
Na seção <SharePoint>/<SafeControls>, adicione um SafeControl para o namespace System.Web.UI das extensões Microsoft Ajax. <Controles Seguros>
<SafeControl Assembly="System.Web.Extensions, Versão=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" Namespace="System.Web.UI" TypeName="*" Safe="True" />
</SafeControls>
Por fim, adicione a seguinte tag de configuração ao final do arquivo web.config, logo antes da tag de fechamento <configuration>.
<system.web.extensões>
<script>
<serviçosweb>
<!-- Remova o comentário desta linha para ativar o serviço de autenticação. Inclua requireSSL="true" se apropriado.
<!--
<authenticationService enabled="true" requireSSL = "true|false"/>
-->
<!-- Remova o comentário dessas linhas para ativar o serviço de perfil Para permitir que as propriedades do perfil sejam recuperadas e modificadas em aplicativos ASP.NET AJAX, você precisa adicionar cada nome de propriedade aos atributos readAccessProperties e writeAccessProperties -->.
<!--
<profileService habilitado = "true"
readAccessProperties="nomedapropriedade1,nomedapropriedade2"
writeAccessProperties="nomedapropriedade1,nomedapropriedade2" />
-->
</webServices>
<!--
<scriptResourceHandler enableCompression="true" enableCaching="true" />
-->
</script>
</system.web.extensions>
<sistema.webServer>
<validação activateIntegratedModeConfiguration="false"/>
<módulos>
<add name="ScriptModule" preCondition="integratedMode" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Versão=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</modules>
<manipuladores>
<remove name="WebServiceHandlerFactory-Integrated" />
<add name="ScriptHandlerFactory" verbo="*" path="*.asmx" preCondition="integratedMode"
type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Versão=1.0.61025.0, Culture=neutro, PublicKeyToken=31bf3856ad364e35"/>
<add name="ScriptHandlerFactoryAppServices" verbo="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Versão=1.0.61025.0, Cultura = neutra, PublicKeyToken = 31bf3856ad364e35"/>
<add name="ScriptResource" preCondition="integratedMode" verbo="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Versão=1.0.61025.0, Cultura =neutro, PublicKeyToken=31bf3856ad364e35" />
</handlers>
</system.webServer>
Desenvolva usando AjaxBaseWebPart
A maneira mais fácil de escrever uma WebPart que usa essa extensão é herdar diretamente o AjaxBaseWebPart escrito por outros. Abaixo está o que eu uso. Você também pode usar outro ou escrever um você mesmo.
Aqui está a parte de referência do namespace:
usando o sistema;
usando System.Collections.Generic;
usando System.Text;
usando System.Web;
usando System.Web.UI.WebControls.WebParts;
usando System.Xml.Serialization;
usando System.Web.UI;
usando Microsoft.SharePoint.WebPartPages;
usando Microsoft.SharePoint.Utilities;
usando System.Web.UI.WebControls;
usando System.Drawing;
A seguir está a parte de implementação da classe AjaxBaseWebPart:
/// <resumo>
/// Uma classe base que implementa todas as funcionalidades necessárias para usar extensões ASP.net Ajax dentro do WSS
/// </sumário>
[XmlRoot(Namespace = "Deps.AjaxBaseWebpart")]
classe abstrata pública AjaxBaseWebpart: Microsoft.SharePoint.WebPartPages.WebPart
{
/*
* A ideia e o código por trás desta web part base foram retirados da postagem do blog do Eric em:
* http://www.capdes.com/2007/02/ajaxbasepart_easy_aspnet_20_aj.html
* Basicamente gerencia a presença e configuração do ScriptManager
* que é exigido pelas extensões ajax do ASP.net para lidar com postbacks, etc. Esta web part também inclui.
* um método comum para lidar com erros.
*/
#region Declarações
string privada _ValidationGroupId;
private ValidationSummary _ErrorContainer;
private ScriptManager_AjaxManager;
#endregion
#region Construtor
público AjaxBaseWebpart()
{
}
#endregion
#region Métodos
/// <resumo>
/// Usado para fornecer uma maneira comum de exibir erros ao usuário da web part atual.
/// </sumário>
/// <param name="message">Descrição do erro ocorrido.</param>
public void RegisterError(mensagem de string)
{
if (this.Controls.Contains(_ErrorContainer))
{
//esta forma de gerar um ID de controle exclusivo é usada em algumas web parts OOB
int contador único;
if (HttpContext.Current.Items["GetUniqueControlId"]!=nulo)
{
UniqueCounter = (int)HttpContext.Current.Items["GetUniqueControlId"];
}
outro
{
contador único = 0;
}
contador único++;
HttpContext.Current.Items["GetUniqueControlId"] = uniqueCounter;
//cria um validador customizado para registrar a mensagem de erro atual com o controle ValidationSummary;
CustomValidator cv = new CustomValidator();
cv.ID = string.Concat("_Error_", uniqueCounter);
cv.ValidationGroup = _ValidationGroupId;
cv.Display = ValidatorDisplay.None;
cv.IsValid = falso;
cv.ErrorMessage = mensagem;
this.Controls.Add(cv);
}
outro
{
//se RegisterError for chamado antes da substituição de CreateChildControls em AjaxBasePart então transfere o usuário para uma página de erro usando o SPUtility
SPUtility.TransferToErrorPage("A função CreateChildControls do AjaxBasePart não foi chamada. Você provavelmente precisará adicionar "base.CreateChildControls()" ao topo de sua substituição CreateChildControls.");
}
}
/// <resumo>
/// Precisa ser chamado para garantir que o controle ValidationSummary esteja registrado na página. Qualquer web part filho precisará ter base.CreateChildControls() na parte superior de sua própria substituição de CreateChildControls.
/// </sumário>
substituição protegida nula CreateChildControls()
{
(
);
{
_ValidationGroupId = Guid.NewGuid().ToString();
_ErrorContainer = new ValidationSummary();
_ErrorContainer.ID = "_ErrorContainer";
_ErrorContainer.ValidationGroup = _ValidationGroupId;
_ErrorContainer.BorderStyle = BorderStyle.Solid;
_ErrorContainer.BorderWidth = Unit.Pixel(3);
_ErrorContainer.BorderColor = Color.Red;
this.Controls.Add(_ErrorContainer);
}
}
#endregion
#region Eventos
/// <resumo>
/// O Oninit é acionado antes do carregamento da página. As modificações na página necessárias para suportar Ajax são feitas aqui.
/// </sumário>
substituição protegida void OnInit (EventArgs e)
{
base.OnInit(e);
//obtém o ScriptManager existente se ele existir na página
_AjaxManager = ScriptManager.GetCurrent(this.Página);
if (_AjaxManager == nulo)
{
//cria novo ScriptManager e EnablePartialRendering
_AjaxManager = novo ScriptManager();
_AjaxManager.EnablePartialRendering = true;
// Corrige problema com postbacks e ações de formulário (DevDiv 55525)
Page.ClientScript.RegisterStartupScript(typeof(AjaxBaseWebpart), this.ID, "_spOriginalFormAction = document.forms[0].action;", true)
; )" bloqueia postbacks assíncronos após o primeiro
//não chamar "_spFormOnSubmitWrapper()" interrompe todos os postbacks
//retornar verdadeiro o tempo todo, anula um pouco o propósito do _spFormOnSubmitWrapper() que é bloquear postbacks repetitivos, mas permite que extensões MS AJAX funcionem corretamente
//é um hack que esperamos ter efeito mínimo
if (this.Page.Form! = Nulo)
{
string formOnSubmitAtt = this.Page.Form.Attributes["onsubmit"];
if (!string.IsNullOrEmpty(formOnSubmitAtt) && formOnSubmitAtt == "return _spFormOnSubmitWrapper();")
{
this.Page.Form.Attributes["onsubmit"] = "_spFormOnSubmitWrapper();";
}
//adiciona o ScriptManager como o primeiro controle no Page.Form
//Não acho que isso realmente importe, mas fiz isso para ser consistente com a forma como você deve colocar o ScriptManager quando usado de forma declarada
this.Page.Form.Controls.AddAt(0, _AjaxManager);
}
}
}
#endregion
#region Propriedades
/// <resumo>
/// Expõe o gerenciador de scripts da página O valor não é definido até depois do OnInit.
/// </sumário>
[WebPartStorage(Storage.None)]
ScriptManager público AjaxManager
{
obter {retornar _AjaxManager};
definir {_AjaxManager = valor};
}
#endregion
}
Durante o desenvolvimento, desde que você herde este WebPart, você pode adicionar UpdatePanel e outros controles nele.