Использование контрола HtmlEditor. Часть 1

Часть 1. Использование HtmlEditor на страницах/контролах SharePoint
Часть 2. Создание своего контрола на базе HtmlEditor
Часть 3. Варианты использование HtmlEditor
Исходные коды демонстрационного проекта

Сегодня я расскажу о том, как можно использовать стандартный редактор форматированного текста на своих страницах (контролах, веб-частях). Постов, посвященных HtmlEditor'у, будет несколько. Начну я с простого примера использования HtmlEditor'а на благо проекта.

HtmlEditor

Контрол HtmlEditor находится в сборке Microsoft.SharePoint.Publishing.dll в пространстве имен Microsoft.SharePoint.Publishing.WebControls. Также нам понадобится сборка Microsoft.Web.CommandUI.dll так как мы будем использовать Ribbon. Ссылки на сборки в проекте

Проект

Для демонстрации я создал новый проект (SharePoint Empty Project), который включает в себя:

  • Layouts\ZhukBlogUsingHtmlEditor\ApplicationPage1.aspx - простая страница приложения со стандартным редактором форматированного текста
  • Layouts\ZhukBlogUsingHtmlEditor\ModalEditor.aspx - страница для модального окна запроса у пользователя информации
  • Layouts\ZhukBlogUsingHtmlEditor\ZhukEditor.aspx - страница для демонстрации работы своего контрола
  • ZhukHtmlEditor.cs - свой контрол, унаследованный от HtmlEditor

В результате получилось следующее: Содержимое демонстрационного проекта

Стандартный HtmlEditor на простой странице приложения

Сначала решим задачу-минимум: заставить работать HtmlEditor на своей странице. Открываем страницу в редакторе и регистрируем пространство имен:

  1. <%@ Register TagPrefix="Publishing" Namespace="Microsoft.SharePoint.Publishing.WebControls"
  2. Assembly="Microsoft.SharePoint.Publishing, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>

Теперь располагаем наш контрол:

  1. <asp:Content ID="Main" ContentPlaceHolderID="PlaceHolderMain" runat="server">
  2.   <Publishing:HtmlEditor ID="Editor" runat="server" />
  3. </asp:Content>

Если теперь продеплоить и открыть нашу страницу, то мы получим NullReferenceException. HtmlEditor обращается к своему свойству Field типа RichHtmlField и не находит его. Здесь мы можем ему помочь, инициализировав новый экземпляр этого класс и подставив его в свойство Field:

  1. protected override void OnInit(EventArgs e)
  2. {
  3.   base.OnInit(e);
  4.   Editor.Field = new RichHtmlField
  5.   {
  6.     EnableViewState = true,
  7.     AllowReusableContent = false,
  8.     ControlMode = SPControlMode.Edit,
  9.     MinimumEditHeight = "300px",
  10.     HasInitialFocus = true
  11.   };
  12. }

Здесь есть один очень важный момент: подставлять Field надо именно в методе OnInit. Если попытаться это сделать в методе OnLoad, то возникает гейзенбаг. Ковырнув поглубже с помощью сборки Microsoft.SharePoint.Publishing.dll, пропущенной через деобфускатор, я выяснил, что исключение порождается при попытке получить текущую версию интерфейса (SPContext.Current.Web.UIVersion). В некоторых случаях это был NullReferenceException, а в некоторых AccessViolationException.

Теперь сделаем наш ribbon видимым, если это необходимо (т.е. если это не происходит неявно из-за других компонентов):

  1. var ribbon = SPRibbon.GetCurrent(Page);
  2. if (ribbon != null)
  3. {
  4.   ribbon.CommandUIVisible = true;
  5. }

Теперь наш HtmlEditor работает. Вот только в режиме редактирования страницы, а нам этого не надо:

Здесь нам поможет метод TrimRTEWikiControls() класса SPRibbon:

  1. internal void TrimRTEWikiControls()
  2. {
  3.   base.TrimById("Ribbon.EditingTools.CPEditTab.Layout");
  4.   base.TrimById("Ribbon.EditingTools.CPEditTab.EditAndCheckout");
  5. }

Вызвать метод напрямую нам не удастся, но никто не мешает воспроизвести его поведение, что я и сделал. Вот теперь все работает. SharePoint HtmlEditor

В следующем посте я покажу пример создания своего контрола на базе стандартного и покажу несколько примеров работы с его свойствами.


Поделиться

Коментарии