Информация в этой статье собрана из многих источников, поэтому я не могу перечислить их все, прошу прощения за это. Содержимое предназначено только для управления личными знаниями.
Службы Windows SharePoint Services v3 построены на основе ASP.NET 2.0. Microsoft ASP.NET AJAX 1.0 был выпущен после MOSS, поэтому в некоторых случаях возникают некоторые проблемы совместимости между ASP.NET AJAX и SharePoint, которые будут решены в Windows SharePoint Services SP1. До этого использование технологии ASP.NET AJAX в SharePoint требовало некоторых специальных шагов по развертыванию.
Примечание.
Существуют ограничения на использование UpdatePanel в веб-части. Подробности см. в документации ASP.NET AJAX. Не все элементы управления можно использовать в UpdatePanel.
Если кэширование вывода включено, вы не сможете использовать ASP.NET AJAX, иначе произойдет ошибка. Классическое противоречие между производительностью и своевременностью.
Преимущества использования технологии Microsoft ASP.NET AJAX 1.0 в SharePoint:
Можно сформировать полную библиотеку ресурсов клиентских сценариев и накопить некоторые повторно используемые компоненты.
Данные нашего веб-сервиса могут отображаться с использованием JSON, а результаты можно легко использовать в приложениях JavaScript/Ajax.
Создание веб-частей с использованием технологии расширений может обеспечить высокоинтерактивные стили, такие как текстовое поле с функцией автозаполнения.
Используйте UpdatePanel в веб-части, чтобы обеспечить взаимодействие без обратных вызовов и сократить количество обновлений страниц.
Ниже приведены шаги по подготовке среды перед развертыванием компонентов, использующих технологию Microsoft ASP.NET AJAX 1.0. (Вам необходимо развернуть его только один раз во вновь установленной среде, и вам не нужно будет добавлять веб-часть позже.)
Загрузите и установите ASP.NET AJAX на ферме веб-серверов.
Сначала необходимо установить «ASP.NET 2.0 AJAX Extensions 1.0». ", который можно загрузить с сайта ajax.asp .net.
Расширение SharePoint web.config для Microsoft ASP.NET AJAX 1.0
Нам нужно зарегистрировать некоторые конкретные записи для Ajax. Отредактируйте файл SharePoint web.config, который обычно находится в следующем каталоге:
c:inetpubwwwrootwssvirtualdirectories80
Добавьте элемент <sectionGroup> в тег <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>
Добавьте содержимое раздела <controls> в теги <system.web>/<pages>. <страницы>
<управление>
<add tagPrefix="asp" namespace="System.Web.UI" Assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</контроля>
</страницы>
Добавьте следующее содержимое в тег <assemblies> внутри тега <compilation>: <assemblies>
<add Assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</сборки>
Добавьте следующее содержимое в раздел <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=" ложь"/>
</httpHandlers>
Добавьте следующий регистрационный контент в раздел HttpModules под всем существующим регистрационным контентом <httpModules>.
<add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</httpМодули>
В разделе <SharePoint>/<SafeControls> добавьте SafeControl для пространства имен System.Web.UI расширений Microsoft Ajax. <SafeControls>
<SafeControl Assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" Namespace="System.Web.UI" TypeName="*" Safe="True" />
</SafeControls>
Наконец, добавьте следующий тег конфигурации в конец файла web.config, непосредственно перед закрывающим тегом <configuration>.
<система.web.extensions>
<скрипт>
<веб-сервисы>
<!-- Раскомментируйте эту строку, чтобы включить службу аутентификации, если необходимо, включите requireSSL="true" -->
<!--
<authenticationService Enabled="true" requireSSL = "true|false"/>
-->
<!-- Раскомментируйте эти строки, чтобы включить службу профиля. Чтобы разрешить извлечение и изменение свойств профиля в приложениях ASP.NET AJAX, вам необходимо добавить каждое имя свойства в атрибуты readAccessProperties и writeAccessProperties -->.
<!--
<profileService Enabled="true"
readAccessProperties="имя_свойства1,имя_свойства2"
writeAccessProperties="имя_свойства1,имя_свойства2" />
-->
</веб-сервисы>
<!--
<scriptResourceHandler EnableCompression="true" EnableCaching="true" />
-->
</скриптинг>
</system.web.extensions>
<система.вебсервер>
<validation validateIntegratedModeConfiguration="false"/>
<модули>
<add name="ScriptModule" preCondition="integratedMode" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</модули>
<обработчики>
<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, Культура=нейтрально, 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 =нейтрально, PublicKeyToken=31bf3856ad364e35" />
</обработчики>
</system.webServer>
Разработка с использованием AjaxBaseWebPart.
Самый простой способ написать веб-часть, использующую это расширение, — напрямую наследовать AjaxBaseWebPart, написанную другими. Ниже приведен тот, который я использую. Вы также можете использовать другой или написать его самостоятельно.
Вот справочная часть пространства имен:
использование системы;
использование System.Collections.Generic;
использование System.Text;
использование System.Web;
использование System.Web.UI.WebControls.WebParts;
использование System.Xml.Serialization;
использование System.Web.UI;
использование Microsoft.SharePoint.WebPartPages;
использование Microsoft.SharePoint.Utilities;
использование System.Web.UI.WebControls;
использование System.Drawing;
Ниже приведена часть реализации класса AjaxBaseWebPart:
/// <сводка>
/// Базовый класс, реализующий все функции, необходимые для использования расширений ASP.net Ajax внутри WSS.
/// </сводка>
[XmlRoot(Namespace = "Deps.AjaxBaseWebpart")]
общедоступный абстрактный класс AjaxBaseWebpart: Microsoft.SharePoint.WebPartPages.WebPart
{
/*
* Идея и код этой базовой веб-части были взяты из сообщения в блоге Erics по адресу:
* http://www.capdes.com/2007/02/ajaxbasepart_easy_aspnet_20_aj.html
* Это в основном управляет наличием и настройкой ScriptManager.
* который требуется расширениям ASP.net для обработки обратной передачи и т. д. Эта веб-часть также включает в себя.
* общий метод обработки ошибок.
*/
#region Декларации
частная строка _ValidationGroupId;
частный ValidationSummary _ErrorContainer;
частный ScriptManager _AjaxManager;
#endregion
#region Конструктор
публичная AjaxBaseWebpart()
{
}
#endregion
#region Методы
/// <сводка>
/// Используется для предоставления общего способа отображения ошибок пользователю текущей веб-части.
/// </сводка>
/// <param name="message">Описание возникшей ошибки.</param>
public void RegisterError (строковое сообщение)
{
если (this.Controls.Contains(_ErrorContainer))
{
//этот способ создания уникального идентификатора элемента управления используется в некоторых веб-частях OOB
ИНТ УникальныйСчетчик;
если (HttpContext.Current.Items["GetUniqueControlId"] != ноль)
{
uniqueCounter = (int)HttpContext.Current.Items["GetUniqueControlId"];
}
еще
{
уникальныйСчетчик = 0;
}
уникальныйСчетчик++;
HttpContext.Current.Items["GetUniqueControlId"] = uniqueCounter;
//создаем собственный валидатор для регистрации текущего сообщения об ошибке с помощью элемента управления ValidationSummary;
CustomValidator cv = новый CustomValidator();
cv.ID = string.Concat("_Error_", uniqueCounter);
cv.ValidationGroup = _ValidationGroupId;
cv.Display = ValidatorDisplay.None;
cv.IsValid = ложь;
cv.ErrorMessage = сообщение;
this.Controls.Add(cv);
}
еще
{
//если RegisterError вызывается до переопределения CreateChildControls в AjaxBasePart, то переносим пользователя на страницу ошибки с помощью SPUtility
SPUtility.TransferToErrorPage("Функция CreateChildControls AjaxBasePart не была вызвана. Вероятно, вам нужно добавить "base.CreateChildControls()" в начало переопределения CreateChildControls.");
}
}
/// <сводка>
/// Необходимо вызвать, чтобы убедиться, что элемент управления ValidationSummary зарегистрирован на странице. Любые дочерние веб-части должны иметь base.CreateChildControls() в верхней части собственного переопределения CreateChildControls.
/// </сводка>
защищенное переопределение void CreateChildControls()
{
base.CreateChildControls();
если (!this.Controls.Contains(_ErrorContainer))
{
_ValidationGroupId = Guid.NewGuid().ToString()
_ErrorContainer = новый 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 События
/// <сводка>
/// Oninit срабатывает перед загрузкой страницы. Здесь выполняются изменения страницы, необходимые для поддержки Ajax.
/// </сводка>
защищенное переопределение void OnInit (EventArgs e)
{
base.OnInit(e);
// получаем существующий ScriptManager, если он существует на странице
_AjaxManager = ScriptManager.GetCurrent(this.Page);
если (_AjaxManager == null)
{
//создаем новый ScriptManager и EnablePartialRendering
_AjaxManager = новый ScriptManager();
_AjaxManager.EnablePartialRendering = true
// Исправление проблемы с обратными передачами и действиями формы (DevDiv 55525);
Page.ClientScript.RegisterStartupScript(typeof(AjaxBaseWebpart), this.ID, "_spOriginalFormAction = document.forms[0].action;", true);
//тег:"form" att:"onsubmit" val:"return _spFormOnSubmitWrapper( )" блокирует асинхронные обратные передачи после первой
//отказ от вызова "_spFormOnSubmitWrapper()" прерывает все обратные передачи
//все время возвращая true, это несколько противоречит цели _spFormOnSubmitWrapper(), которая заключается в блокировании повторяющихся обратных передач, но позволяет расширениям MS AJAX работать правильно
//это хак, который, надеюсь, даст минимальный эффект
если (this.Page.Form!= ноль)
{
строка formOnSubmitAtt = this.Page.Form.Attributes["onsubmit"];
if (!string.IsNullOrEmpty(formOnSubmitAtt) && formOnSubmitAtt == "return _spFormOnSubmitWrapper();")
{
this.Page.Form.Attributes["onsubmit"] = "_spFormOnSubmitWrapper();";
}
// добавляем ScriptManager в качестве первого элемента управления в Page.Form
//Я не думаю, что это действительно имеет значение, но я сделал это, чтобы соответствовать тому, как вы должны размещать ScriptManager при декларативном использовании
this.Page.Form.Controls.AddAt(0, _AjaxManager);
}
}
}
#endregion
#region Свойства
/// <сводка>
/// Предоставляет доступ к диспетчеру сценариев страницы. Значение не устанавливается до тех пор, пока не произойдет OnInit.
/// </сводка>
[WebPartStorage(Storage.None)]
общедоступный ScriptManager AjaxManager
{
получить {возврат _AjaxManager;
установить { _AjaxManager = значение };
}
#конечныйрегион
}
Во время разработки, если вы наследуете эту веб-часть, вы можете добавить UpdatePanel и добавить в нее другие элементы управления.