Использование контрола 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 на своей странице. Открываем страницу в редакторе и регистрируем пространство имен:
- <%@ Register TagPrefix="Publishing" Namespace="Microsoft.SharePoint.Publishing.WebControls"
- Assembly="Microsoft.SharePoint.Publishing, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
Теперь располагаем наш контрол:
- <asp:Content ID="Main" ContentPlaceHolderID="PlaceHolderMain" runat="server">
- <Publishing:HtmlEditor ID="Editor" runat="server" />
- </asp:Content>
Если теперь продеплоить и открыть нашу страницу, то мы получим NullReferenceException. HtmlEditor обращается к своему свойству Field типа RichHtmlField и не находит его. Здесь мы можем ему помочь, инициализировав новый экземпляр этого класс и подставив его в свойство Field:
- protected override void OnInit(EventArgs e)
- {
- base.OnInit(e);
- Editor.Field = new RichHtmlField
- {
- EnableViewState = true,
- AllowReusableContent = false,
- ControlMode = SPControlMode.Edit,
- MinimumEditHeight = "300px",
- HasInitialFocus = true
- };
- }
Здесь есть один очень важный момент: подставлять Field надо именно в методе OnInit. Если попытаться это сделать в методе OnLoad, то возникает гейзенбаг. Ковырнув поглубже с помощью сборки Microsoft.SharePoint.Publishing.dll, пропущенной через деобфускатор, я выяснил, что исключение порождается при попытке получить текущую версию интерфейса (SPContext.Current.Web.UIVersion). В некоторых случаях это был NullReferenceException, а в некоторых AccessViolationException.
Теперь сделаем наш ribbon видимым, если это необходимо (т.е. если это не происходит неявно из-за других компонентов):
- var ribbon = SPRibbon.GetCurrent(Page);
- if (ribbon != null)
- {
- ribbon.CommandUIVisible = true;
- }
Теперь наш HtmlEditor работает. Вот только в режиме редактирования страницы, а нам этого не надо:
Здесь нам поможет метод TrimRTEWikiControls() класса SPRibbon:
- internal void TrimRTEWikiControls()
- {
- base.TrimById("Ribbon.EditingTools.CPEditTab.Layout");
- base.TrimById("Ribbon.EditingTools.CPEditTab.EditAndCheckout");
- }
Вызвать метод напрямую нам не удастся, но никто не мешает воспроизвести его поведение, что я и сделал. Вот теперь все работает.
В следующем посте я покажу пример создания своего контрола на базе стандартного и покажу несколько примеров работы с его свойствами.