Les informations contenues dans cet article proviennent de nombreuses sources, je ne peux donc pas toutes les énumérer et je m'en excuse. Le contenu est uniquement destiné à la gestion des connaissances personnelles.
Windows SharePoint Services v3 est basé sur ASP.NET 2.0. Microsoft ASP.NET AJAX 1.0 a été lancé après MOSS. Dans certains cas, il existe donc des problèmes de compatibilité entre ASP.NET AJAX et SharePoint, qui seront résolus dans Windows SharePoint Services SP1. Avant cela, l'utilisation de la technologie ASP.NET AJAX dans SharePoint nécessitait des étapes de déploiement spéciales.
Remarque :
Il existe des restrictions sur l'utilisation de UpdatePanel dans le composant WebPart. Veuillez consulter la documentation ASP.NET AJAX pour plus de détails. Tous les contrôles ne peuvent pas être utilisés dans UpdatePanel.
Si la mise en cache de sortie est activée, vous ne pouvez pas utiliser ASP.NET AJAX ou une erreur se produira. La contradiction classique entre performance et rapidité.
Avantages de l'utilisation de la technologie Microsoft ASP.NET AJAX 1.0 dans SharePoint :
Une bibliothèque complète de ressources de script client peut être constituée et certains composants réutilisables peuvent être accumulés.
Les données de notre service Web peuvent être affichées en JSON et les résultats peuvent être facilement utilisés dans les applications JavaScript/Ajax.
La création de WebParts à l'aide de la technologie des extensions peut fournir des styles hautement interactifs, tels qu'une zone de texte avec une fonctionnalité de saisie semi-automatique.
Utilisez UpdatePanel dans WebPart pour obtenir une interaction sans rappel et réduire le nombre d'actualisations de page.
Voici les étapes de préparation de l'environnement avant de déployer des composants qui utilisent la technologie Microsoft ASP.NET AJAX 1.0. (Vous ne devez le déployer qu'une seule fois dans l'environnement nouvellement installé et vous n'aurez pas besoin d'ajouter Webpart ultérieurement)
Téléchargez et installez ASP.NET AJAX sur la batterie de serveurs Web.
Tout d'abord, vous devez installer "ASP.NET 2.0 AJAX Extensions 1.0". ", qui peut être téléchargé à partir du téléchargement ajax.asp .net.
Extension de SharePoint web.config pour Microsoft ASP.NET AJAX 1.0
Nous devons enregistrer certaines entrées spécifiques pour Ajax. Modifiez le fichier SharePoint web.config, qui se trouve généralement dans le répertoire suivant :
c:inetpubwwwrootwssvirtualdirectories80
Ajoutez l'élément <sectionGroup> à la balise <configSections> : <configSections>
<sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
<sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, 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, Version=1.0.61025.0, Culture=neutral, 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>
Ajoutez le contenu de la section <controls> dans les balises <system.web>/<pages>. <pages>
<contrôles>
<add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</contrôles>
</pages>
Ajoutez le contenu suivant dans la balise <assemblies> dans la balise <compilation> : <assemblies>
<add assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</assemblages>
Ajoutez le contenu suivant dans la section <httpHandlers> : <httpHandlers>
<add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken= 31bf3856ad364e35"/>
<add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken =31bf3856ad364e35"/>
<add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate=" faux"/>
</httpGestionnaires>
Ajoutez le contenu d'inscription suivant dans la section HttpModules, sous tout le contenu d'inscription existant <httpModules>
<add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</httpModules>
Dans la section <SharePoint>/<SafeControls>, ajoutez un SafeControl pour l'espace de noms System.Web.UI des extensions Microsoft Ajax. <ContrôlesSécurisés>
<SafeControl Assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" Namespace="System.Web.UI" TypeName="*" Safe="True" />
</SafeControls>
Enfin, ajoutez la balise de configuration suivante à la fin du fichier web.config, juste avant la balise de fermeture <configuration>.
<système.web.extensions>
<script>
<WebServices>
<!-- Décommentez cette ligne pour activer le service d'authentification. Incluez requireSSL="true" si nécessaire -->.
<!--
<authenticationService activé="true" requireSSL = "true|false"/>
-->
<!-- Décommentez ces lignes pour activer le service de profil. Pour permettre la récupération et la modification des propriétés de profil dans les applications ASP.NET AJAX, vous devez ajouter chaque nom de propriété aux attributs readAccessProperties et writeAccessProperties -->.
<!--
<profileService activé="true"
readAccessProperties="nom de propriété1, nom de propriété2"
writeAccessProperties="nom de propriété1,nom de propriété2" />
-->
</WebServices>
<!--
<scriptResourceHandler activateCompression="true" activateCaching="true" />
-->
</script>
</system.web.extensions>
<système.serveurweb>
<validation validateIntegratedModeConfiguration="false"/>
<modules>
<add name="ScriptModule" preCondition="integratedMode" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</modules>
<gestionnaires>
<remove name="WebServiceHandlerFactory-Integrated" />
<add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode"
type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutre, PublicKeyToken=31bf3856ad364e35"/>
<add name="ScriptResource" preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=1.0.61025.0, Culture =neutre, PublicKeyToken=31bf3856ad364e35" />
</gestionnaires>
</system.webServer>
Développer à l'aide d'AjaxBaseWebPart.
Le moyen le plus simple d'écrire un WebPart qui utilise cette extension est d'hériter directement de l'AjaxBaseWebPart écrit par d'autres. Ci-dessous, celui que j'utilise. Vous pouvez également en utiliser un autre ou en écrire un vous-même.
Voici la partie de référence de l'espace de noms :
utiliser le système ;
en utilisant System.Collections.Generic ;
en utilisant System.Text ;
en utilisant System.Web ;
en utilisant System.Web.UI.WebControls.WebParts ;
en utilisant System.Xml.Serialization ;
en utilisant System.Web.UI ;
en utilisant Microsoft.SharePoint.WebPartPages ;
en utilisant Microsoft.SharePoint.Utilities ;
en utilisant System.Web.UI.WebControls ;
en utilisant System.Drawing ;
Voici la partie implémentation de la classe AjaxBaseWebPart :
/// <résumé>
/// Une classe de base qui implémente toutes les fonctionnalités requises pour utiliser les extensions ASP.net Ajax dans WSS
/// </summary>
[XmlRoot(Espace de noms = "Deps.AjaxBaseWebpart")]
classe abstraite publique AjaxBaseWebpart : Microsoft.SharePoint.WebPartPages.WebPart
{
/*
* L'idée et le code derrière ce composant WebPart de base sont tirés du billet de blog d'Erics à l'adresse :
* http://www.capdes.com/2007/02/ajaxbasepart_easy_aspnet_20_aj.html
* Ceci gère essentiellement la présence et la configuration du ScriptManager
* qui est requis par les extensions ajax ASP.net pour gérer les publications, ect. Ce composant WebPart comprend également.
* une méthode courante pour gérer les erreurs.
*/
#region Déclarations
chaîne privée _ValidationGroupId ;
Private ValidationSummary _ErrorContainer ;
ScriptManager privé _AjaxManager ;
#endregion
#region Constructeur
public AjaxBaseWebpart()
{
}
#endregion
#region Méthodes
/// <résumé>
/// Utilisé pour fournir un moyen courant d'afficher les erreurs à l'utilisateur du composant WebPart actuel.
/// </summary>
/// <param name="message">Description de l'erreur survenue.</param>
public void RegisterError (message de chaîne)
{
si (this.Controls.Contains(_ErrorContainer))
{
//cette façon de générer un identifiant de contrôle unique est utilisée dans certains composants WebPart OOB
int compteur unique ;
if (HttpContext.Current.Items["GetUniqueControlId"] != null)
{
uniqueCounter = (int)HttpContext.Current.Items["GetUniqueControlId"];
}
autre
{
compteur unique = 0 ;
}
uniqueCounter++ ;
HttpContext.Current.Items["GetUniqueControlId"] = uniqueCounter;
//crée un validateur personnalisé pour enregistrer le message d'erreur actuel avec le contrôle ValidationSummary
CustomValidator cv = new CustomValidator();
cv.ID = string.Concat("_Error_", uniqueCounter);
cv.ValidationGroup = _ValidationGroupId;
cv.Display = ValidatorDisplay.None ;
cv.IsValid = false;
cv.ErrorMessage = message;
this.Controls.Add(cv);
}
autre
{
// si RegisterError est appelé avant le remplacement de CreateChildControls dans AjaxBasePart, transférez l'utilisateur vers une page d'erreur à l'aide de SPUtility
SPUtility.TransferToErrorPage("La fonction CreateChildControls de AjaxBasePart n'a pas été appelée. Vous devrez probablement ajouter "base.CreateChildControls()" en haut de votre remplacement CreateChildControls.");
}
}
/// <résumé>
/// Doit être appelé pour garantir que le contrôle ValidationSummary est enregistré sur la page. Tous les composants WebPart enfants devront avoir base.CreateChildControls() en haut de leur propre remplacement CreateChildControls.
/// </summary>
remplacement protégé void CreateChildControls()
{
base.CreateChildControls();
si (!this.Controls.Contains(_ErrorContainer))
{
_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 Événements
/// <résumé>
/// Oninit se déclenche avant le chargement de la page. Les modifications de la page nécessaires au support d'Ajax sont effectuées ici.
/// </summary>
remplacement protégé void OnInit (EventArgs e)
{
base.OnInit(e);
//récupère le ScriptManager existant s'il existe sur la page
_AjaxManager = ScriptManager.GetCurrent(this.Page);
si (_AjaxManager == null)
{
//crée un nouveau ScriptManager et EnablePartialRendering
_AjaxManager = nouveau ScriptManager();
_AjaxManager.EnablePartialRendering = true;
// Correction d'un problème avec les publications et les actions de formulaire (DevDiv 55525)
Page.ClientScript.RegisterStartupScript(typeof(AjaxBaseWebpart), this.ID, "_spOriginalFormAction = document.forms[0].action;", true);
//tag:"form" att:"onsubmit" val:"return _spFormOnSubmitWrapper( )" bloque les publications asynchrones après la première
//ne pas appeler "_spFormOnSubmitWrapper()" interrompt toutes les publications
//retourner true tout le temps, va quelque peu à l'encontre du but de _spFormOnSubmitWrapper() qui est de bloquer les publications répétitives, mais cela permet aux extensions MS AJAX de fonctionner correctement
//c'est un hack qui, espérons-le, aura un effet minimal
si (this.Page.Form != null)
{
chaîne formOnSubmitAtt = this.Page.Form.Attributes["onsubmit"];
if (!string.IsNullOrEmpty(formOnSubmitAtt) && formOnSubmitAtt == "return _spFormOnSubmitWrapper();")
{
this.Page.Form.Attributes["onsubmit"] = "_spFormOnSubmitWrapper();";
}
//ajoute le ScriptManager comme premier contrôle dans Page.Form
//Je ne pense pas que cela ait vraiment d'importance, mais je l'ai fait pour être cohérent avec la façon dont vous êtes censé placer le ScriptManager lorsqu'il est utilisé de manière déclarative
this.Page.Form.Controls.AddAt(0, _AjaxManager);
}
}
}
#endregion
#region Propriétés
/// <résumé>
/// Expose le gestionnaire de script de la page. La valeur n'est définie qu'après OnInit.
/// </summary>
[WebPartStorage(Storage.Aucun)]
public ScriptManagerAjaxManager
{
obtenir { retourner _AjaxManager }
définir { _AjaxManager = valeur }
}
#endregion
}
Pendant le développement, tant que vous héritez de ce WebPart, vous pouvez ajouter UpdatePanel et y ajouter d'autres contrôles.