Die Informationen in diesem Artikel stammen aus vielen Quellen, daher kann ich mich dafür entschuldigen. Der Inhalt dient ausschließlich dem persönlichen Wissensmanagement.
Windows SharePoint Services v3 basiert auf ASP.NET 2.0. Microsoft ASP.NET AJAX 1.0 wurde nach MOSS gestartet, daher gibt es in einigen Fällen einige Kompatibilitätsprobleme zwischen ASP.NET AJAX und SharePoint, die in Windows SharePoint Services SP1 behoben werden. Zuvor waren für die Verwendung der ASP.NET AJAX-Technologie in SharePoint einige spezielle Bereitstellungsschritte erforderlich.
Hinweis:
Es gibt Einschränkungen für die Verwendung von UpdatePanel im Webpart. Weitere Informationen finden Sie in der ASP.NET AJAX-Dokumentation. Nicht alle Steuerelemente können in UpdatePanel verwendet werden.
Wenn das Ausgabe-Caching aktiviert ist, können Sie ASP.NET AJAX nicht verwenden, da andernfalls ein Fehler auftritt. Der klassische Widerspruch zwischen Leistung und Aktualität.
Vorteile der Verwendung der Microsoft ASP.NET AJAX 1.0-Technologie in SharePoint:
Es kann eine vollständige Client-Skript-Ressourcenbibliothek erstellt und einige wiederverwendbare Komponenten akkumuliert werden.
Unsere Webservice-Daten können mit JSON angezeigt werden und die Ergebnisse können problemlos in JavaScript/Ajax-Anwendungen verwendet werden.
Durch das Erstellen von WebParts mithilfe der Technologie in Erweiterungen können äußerst interaktive Stile bereitgestellt werden, beispielsweise ein Textfeld mit automatischer Vervollständigungsfunktion.
Verwenden Sie UpdatePanel in WebPart, um eine rückruffreie Interaktion zu erreichen und die Anzahl der Seitenaktualisierungen zu reduzieren.
Im Folgenden finden Sie die Schritte zur Umgebungsvorbereitung vor der Bereitstellung von Komponenten, die die Microsoft ASP.NET AJAX 1.0-Technologie verwenden. (Sie müssen es nur einmal in der neu installierten Umgebung bereitstellen und müssen Webpart später nicht hinzufügen.)
Laden Sie ASP.NET AJAX herunter und installieren Sie es auf der Webserverfarm.
Zuerst müssen Sie „ASP.NET 2.0 AJAX Extensions 1.0“ installieren ", das von ajax.asp.net heruntergeladen werden kann.
Erweiterung von SharePoint web.config für Microsoft ASP.NET AJAX 1.0
Wir müssen einige spezifische Einträge für Ajax registrieren. Bearbeiten Sie die SharePoint-Datei web.config, die sich normalerweise im folgenden Verzeichnis befindet:
c:inetpubwwwrootwssvirtualdirectories80
Fügen Sie das Element <sectionGroup> zum Tag <configSections> hinzu: <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>
Fügen Sie den Inhalt des Abschnitts <controls> innerhalb der Tags <system.web>/<pages> hinzu. <Seiten>
<Steuerelemente>
<add tagPrefix="asp" namespace="System.Web.UI" Assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</controls>
</pages>
Fügen Sie den folgenden Inhalt innerhalb des <assemblies>-Tags innerhalb des <compilation>-Tags hinzu: <assemblies>
<add Assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</assemblies>
Fügen Sie den folgenden Inhalt im Abschnitt <httpHandlers> hinzu: <httpHandlers>
<add verb="*" path="*.asmx" valide="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken= 31bf3856ad364e35"/>
<add verb="*" path="*_AppService.axd" valide="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" validieren=" falsch"/>
</httpHandlers>
Fügen Sie den folgenden Registrierungsinhalt im Abschnitt „HttpModules“ unter allen vorhandenen Registrierungsinhalten <httpModules> hinzu
<add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</httpModules>
Fügen Sie im Abschnitt <SharePoint>/<SafeControls> ein SafeControl für den System.Web.UI-Namespace von Microsoft Ajax Extensions hinzu. <SafeControls>
<SafeControl Assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" Namespace="System.Web.UI" TypeName="*" Safe="True" />
</SafeControls>
Fügen Sie abschließend das folgende Konfigurations-Tag am Ende der web.config-Datei hinzu, direkt vor dem schließenden <configuration>-Tag.
<system.web.extensions>
<scripting>
<webServices>
<!-- Kommentieren Sie diese Zeile aus, um den Authentifizierungsdienst zu aktivieren. Fügen Sie ggf. requireSSL="true" ein
<!--
<authenticationService aktiviert="true" requireSSL = "true|false"/>
->
<!-- Kommentieren Sie diese Zeilen aus, um das Abrufen und Ändern von Profileigenschaften in ASP.NET AJAX-Anwendungen zu ermöglichen. Sie müssen jeden Eigenschaftsnamen zu den Attributen readAccessProperties und writeAccessProperties hinzufügen
<!--
<profileService aktiviert="true"
readAccessProperties="propertyname1,propertyname2"
writeAccessProperties="propertyname1,propertyname2" />
->
</webServices>
<!--
<scriptResourceHandler enableCompression="true" enableCaching="true" />
->
</scripting>
</system.web.extensions>
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<Module>
<add name="ScriptModule" preCondition="integratedMode" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</modules>
<Handler>
<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=neutral, 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 =neutral, PublicKeyToken=31bf3856ad364e35" />
</handlers>
</system.webServer>
Entwickeln Sie mit AjaxBaseWebPart.
Der einfachste Weg, ein WebPart zu schreiben, das diese Erweiterung verwendet, besteht darin, das von anderen geschriebene AjaxBaseWebPart direkt zu erben. Unten ist die, die ich verwende. Sie können auch ein anderes verwenden oder selbst eines schreiben.
Hier ist der Namespace-Referenzteil:
Verwenden des Systems;
mit System.Collections.Generic;
Verwenden von System.Text;
mit System.Web;
mit System.Web.UI.WebControls.WebParts;
mit System.Xml.Serialization;
mit System.Web.UI;
mit Microsoft.SharePoint.WebPartPages;
Verwendung von Microsoft.SharePoint.Utilities;
mit System.Web.UI.WebControls;
Verwenden von System.Drawing;
Das Folgende ist der Implementierungsteil der AjaxBaseWebPart-Klasse:
/// <Zusammenfassung>
/// Eine Basisklasse, die alle für die Verwendung von ASP.net-Ajax-Erweiterungen in WSS erforderlichen Funktionen implementiert
/// </summary>
[XmlRoot(Namespace = "Deps.AjaxBaseWebpart")]
öffentliche abstrakte Klasse AjaxBaseWebpart: Microsoft.SharePoint.WebPartPages.WebPart
{
/*
* Die Idee und der Code hinter diesem Basis-Webpart stammen aus Erics Blog-Beitrag unter:
* http://www.capdes.com/2007/02/ajaxbasepart_easy_aspnet_20_aj.html
* Dies verwaltet im Wesentlichen die Anwesenheit und Konfiguration des ScriptManagers
* was für ASP.net-Ajax-Erweiterungen erforderlich ist, um Postbacks usw. zu verarbeiten. Dieses Webpart enthält auch
* eine gängige Methode zur Fehlerbehandlung.
*/
#region-Erklärungen
private Zeichenfolge _ValidationGroupId;
private ValidationSummary _ErrorContainer;
privater ScriptManager _AjaxManager;
#endregion
#region Konstruktor
öffentliches AjaxBaseWebpart()
{
}
#endregion
#region Methoden
/// <Zusammenfassung>
/// Wird verwendet, um dem Benutzer des aktuellen Webparts eine allgemeine Möglichkeit zur Anzeige von Fehlern bereitzustellen.
/// </summary>
/// <param name="message">Beschreibung des aufgetretenen Fehlers.</param>
public void RegisterError(string message)
{
if (this.Controls.Contains(_ErrorContainer))
{
//Diese Art der Generierung einer eindeutigen Steuer-ID wird in einigen OOB-Webparts verwendet
int uniqueCounter;
if (HttpContext.Current.Items["GetUniqueControlId"] != null)
{
uniqueCounter = (int)HttpContext.Current.Items["GetUniqueControlId"];
}
anders
{
uniqueCounter = 0;
}
uniqueCounter++;
HttpContext.Current.Items["GetUniqueControlId"] = uniqueCounter;
//einen benutzerdefinierten Validator erstellen, um die aktuelle Fehlermeldung beim ValidationSummary-Steuerelement zu registrieren
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);
}
anders
{
//Wenn RegisterError vor der CreateChildControls-Überschreibung in AjaxBasePart aufgerufen wird, wird der Benutzer mithilfe von SPUtility auf eine Fehlerseite weitergeleitet
SPUtility.TransferToErrorPage("Die CreateChildControls-Funktion des AjaxBasePart wurde nicht aufgerufen. Sie müssen wahrscheinlich "base.CreateChildControls()" am Anfang Ihrer CreateChildControls-Überschreibung hinzufügen.");
}
}
/// <Zusammenfassung>
/// Muss aufgerufen werden, um sicherzustellen, dass das ValidationSummary-Steuerelement auf der Seite registriert ist. Alle untergeordneten Webparts müssen base.CreateChildControls() oben in ihrer eigenen CreateChildControls-Überschreibung haben.
/// </summary>
protected override void CreateChildControls()
{
base.CreateChildControls();
if (!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 Ereignisse
/// <Zusammenfassung>
/// Oninit wird vor dem Laden der Seite ausgeführt, die zur Unterstützung von Ajax erforderlich sind.
/// </summary>
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
//den vorhandenen ScriptManager abrufen, falls er auf der Seite vorhanden ist
_AjaxManager = ScriptManager.GetCurrent(this.Page);
if (_AjaxManager == null)
{
//Neuen ScriptManager und EnablePartialRendering erstellen
_AjaxManager = new ScriptManager();
_AjaxManager.EnablePartialRendering = true;
// Problem mit Postbacks und Formularaktionen beheben (DevDiv 55525)
Page.ClientScript.RegisterStartupScript(typeof(AjaxBaseWebpart), this.ID, "_spOriginalFormAction = document.forms[0].action;", true);
//tag:"form" att:"onsubmit" val:"return _spFormOnSubmitWrapper( )“ blockiert asynchrone Postbacks nach dem ersten
//Wenn „_spFormOnSubmitWrapper()“ nicht aufgerufen wird, werden alle Postbacks unterbrochen
//die ganze Zeit „true“ zurückzugeben, verfehlt etwas den Zweck von _spFormOnSubmitWrapper(), der darin besteht, sich wiederholende Postbacks zu blockieren, aber es ermöglicht, dass MS AJAX-Erweiterungen ordnungsgemäß funktionieren
//Es ist ein Hack, der hoffentlich nur minimale Auswirkungen hat
if (this.Page.Form != null)
{
string formOnSubmitAtt = this.Page.Form.Attributes["onsubmit"];
if (!string.IsNullOrEmpty(formOnSubmitAtt) && formOnSubmitAtt == "return _spFormOnSubmitWrapper();")
{
this.Page.Form.Attributes["onsubmit"] = "_spFormOnSubmitWrapper();";
}
//Füge den ScriptManager als erstes Steuerelement im Page.Form hinzu
//Ich glaube nicht, dass das wirklich wichtig ist, aber ich habe es getan, um mit der Art und Weise übereinzustimmen, wie Sie den ScriptManager bei deklarierter Verwendung platzieren sollen
this.Page.Form.Controls.AddAt(0, _AjaxManager);
}
}
}
#endregion
#region-Eigenschaften
/// <Zusammenfassung>
/// Macht den Skriptmanager der Seite verfügbar. Der Wert wird erst nach OnInit festgelegt
/// </summary>
[WebPartStorage(Storage.None)]
öffentlicher ScriptManager AjaxManager
{
get { return _AjaxManager }
set { _AjaxManager = value;
}
#endregion
}
Während der Entwicklung können Sie, solange Sie dieses WebPart erben, UpdatePanel und andere Steuerelemente hinzufügen.