МОСС: Пример функциональной – пользовательский тип данных

Бизнес-сценарий:

Осуществление в масштабах всего предприятия мха для производства компании с 30+ сайты и несколько десятков корпоративных отделов.

Бизнес-цель:

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

Техническая проблема:

Таксономия предприятия был реализован с использованием нескольких семейств сайтов. Мы хотели бы создать авторитетный список физических мест пользовательского списка WSS. Затем, когда нам необходимо иметь столбец в типе контента (или столбец добавлен в библиотеку или список doc) которая содержала корпоративных отделений, Мы хотели бы создать столбец с использованием «поиска" тип данных и указывают на этот мастер список.

К сожалению, типы данных поиска необходимо получить доступ к список Источник «локально" означает, что наш авторитетный список не могут охватывать семейств веб-сайтов.

Техническое решение:

Реализация нового пользовательского типа данных реализованы на основе SPField и представлено в виде DropDownList в пользовательском интерфейсе, чьи ListItems заполнения из главного списка WSS.

Мы создали новое семейство под названием "http://localhost/EnterpriseData". Там, Мы создали пользовательский список с именем «Корпоративных отделений». Этот список просто использует стандартный заголовок»" поле будет содержать список фактических корпоративных мест.

Один следует несколько дискретных шагов для создания пользовательского типа данных в WSS. Они являются:

  1. Определите класс, который наследует от класса SPField (один может наследовать от других полей, если требуется).

Вот код для этого:

государственные класс XYZZYCorporateLocationField : SPFieldText
{
государственные XYZZYCorporateLocationField
(SPFieldCollection поля, Строка typeName, Строка displayName)
: база(поля, typeName, displayName) { }

государственные XYZZYCorporateLocationField
(SPFieldCollection поля, Строка displayName)
: база(поля, displayName) { }

государственные Переопределение BaseFieldControl FieldRenderingControl
{
Получить
{
BaseFieldControl управления = Новые функции XYZZYCorporateLocationFieldControl();
управления. Имя_поля = Это.InternalName;
возвращение управления;
} //Получить
} // FieldRenderingControl

государственные Переопределение Строка GetValidatedString(объект значение)
{
Если (Это.Обязательно || значение. ToString().Равно(Строка.Пустой))
{
бросать Новые функции SPFieldValidationException («Департамент не назначается.");
}
возвращение база.GetValidatedString(значение);
} // GetValidatedString

} // XYZZYCorporateLocation

  1. Определить другой класс, наследуемый от базового поля элемента управления, как и в:

государственные класс XYZZYCorporateLocationFieldControl : BaseFieldControl
{
Защита DropDownList XYZZYCorporateLocationSelector;

Защита Переопределение Строка DefaultTemplateName
{
Получить
{
возвращение «XYZZYCorporateLocationFieldControl";
}
} // DefaultTemplateName

государственные Переопределение объект Значение
{
Получить
{
EnsureChildControls();
возвращение Это.XYZZYCorporateLocationSelector. SelectedValue;
} // Получить
набор
{
EnsureChildControls();
Это.XYZZYCorporateLocationSelector.SelectedValue = (Строка)Это.ItemFieldValue, при;
} // набор
} // переопределить объект значение

Защита Переопределение void CreateChildControls()
{

Если (Это.Поле == значение NULL || Это.ControlMode == SPControlMode.Дисплей)
возвращение;

база.CreateChildControls();

Это.XYZZYCorporateLocationSelector =
(DropDownList)FindControl TemplateContainer.(«XYZZYCorporateLocationSelector");

Если (Это.XYZZYCorporateLocationSelector == значение NULL)
бросать Новые функции Исключение(«ОШИБКА: Не удается загрузить. ASCX-файл!");

Если (!Это.IsPostBack страницы.)
{

использование (SPSite сайта = Новые функции SPSite(«http://localhost/enterprisedata"))
{
использование (SPWeb веб сайт =. OpenWeb())
{

SPList currentList = web. Списки[«Корпоративный места"];

по каждому элементу (SPItem XYZZYCorporateLocation в currentList.Items)
{
Если (XYZZYCorporateLocation["Название"] == значение NULL) продолжить;

Строка theTitle;
theTitle = XYZZYCorporateLocation["Название"].ToString();

Это.XYZZYCorporateLocationSelector.Items.Add
(Новые функции ListItem(theTitle, theTitle));

} // по каждому элементу

} // с помощью веб-spweb = site.openweb()
} // используя сайт spsite = новые spsite(«http://localhost/enterprisedata»)

} // Если не обратной передачи

} // CreateChildControls

} // XYZZYCorporateLocationFieldControl

Приведенный выше код в основном реализует логику для заполнения DropDownList с ценностями из пользовательского списка WSS, расположен в http://localhost/enterprisedata и именем «Корпоративные отделы».

Я определил обоих классов в одном CS-файл, скомпилировал его и положил его в глобальный кэш сборок (сильный требуется, Конечно).

  1. Реализация шаблона элемента управления (.ASCX) как показано:

<%@ Управления Язык= "C#" Наследует="Microsoft.SharePoint.Portal.serveradmin.CreateSiteCollectionPanel1,Microsoft.SharePoint.Portal,Версия = 12.0.0.0, культура = neutral,PublicKeyToken = 71e9bce111e9429c" compilationMode«Всегда =" %>
<%
@ Зарегистрироваться TagPrefix= «wssawc" Пространство имен="Microsoft.SharePoint.WebControls" Ассамблея="Microsoft.SharePoint, Версия = 12.0.0.0, Культура = нейтральных, PublicKeyToken = 71e9bce111e9429c" %> <%@ Зарегистрироваться TagPrefix= "SharePoint" Пространство имен="Microsoft.SharePoint.WebControls" Ассамблея="Microsoft.SharePoint, Версия = 12.0.0.0, Культура = нейтральных, PublicKeyToken = 71e9bce111e9429c" %>
<SharePoint:RenderingTemplate ID= «XYZZYCorporateLocationFieldControl" runat= «сервер»>
<Шаблон>
<ASP:DropDownList ID= «XYZZYCorporateLocationSelector" runat= "сервер" />
</Шаблон>
</
SharePoint:RenderingTemplate>

Выше сохраняется в c:\Программа filescommon filesmicrosoft sharedweb сервера extensions12controltemplates.

  1. Наконец, Мы создаем XML-файл для сохранения в... 12XML каталог. Это CAML, который определяет наш пользовательский тип данных и для моего примера, как это выглядит:

<?XML Версия="1.0" кодирование="UTF-8" ?>
<
FieldTypes>
<
FieldType>
<
Поле Имя="TypeName">CorporateLocations</Поле>
<
Поле Имя="ParentType">Текст</Поле>
<
Поле Имя="TypeDisplayName">Корпоративные места</Поле>
<
Поле Имя="TypeShortDescription">Все XYZZY корпоративных отделений, включая производство или других объектов.</Поле>
<
Поле Имя="UserCreatable">ПРАВДА</Поле>
<
Поле Имя="ShowInListCreate">ПРАВДА</Поле>
<
Поле Имя="ShowInDocumentLibraryCreate">ПРАВДА</Поле>
<
Поле Имя="ShowInSurveyCreate">ПРАВДА</Поле>
<
Поле Имя="ShowInColumnTemplateCreate">ПРАВДА</Поле>
<
Поле Имя="FieldTypeClass">Conchango.XYZZYCorporateLocationField, XYZZYCorporateLocationField, Версия = 1.0.0.0, Культура = нейтральных, PublicKeyToken = b0b19e85410990c4</Поле>
<
RenderPattern Имя="DisplayPattern">
<
Переключатель>
<
Expr>
<
Колонка />
</
Expr>

<Дело Значение=""/>

<По умолчанию>
<
HTML>
<![CDATA[
<Span style = "цвет:Красный»><b>]]>
</
HTML>

<
Колонка SubColumnNumber="0" HTMLEncode="ПРАВДА"/>

<HTML><![CDATA[</b></диапазон>]]></HTML>

</
По умолчанию>
</
Переключатель>

</
RenderPattern>
</
FieldType>
</
FieldTypes>
Этот XML-файл добавляет тип пользовательских данных WSS «Библиотека" и матчи против ПКК был Ассамблеи.

После переезда все эти биты на место, IISRESET на сервере и это все должны начать работать красиво.

3 мысли о «МОСС: Пример функциональной – пользовательский тип данных

  1. Alejandro
    Привет Павел,
    Прежде всего, Спасибо за статью, потому что это очень интересно. Только один вопрос;
    Знаете ли вы, если это возможно для правильного отображения настраиваемого типа поля в представлении таблицы данных списка?
    Потому что каждый тип настраиваемого поля, я создаю это показано как доступный только для чтения в режиме таблицы (и MSDN, Например, не очень мне помочь :-S).
    Спасибо
  2. Линдсей

    Я пытаюсь реализовать ваше решение. Однако я вместо DropDownList, У меня только вариант для DropDownChoiceList. Вы будете знать, как добавление элементов в DropDownChoiceList? Мы используем SharePoint 2007 (SP1) и Visual Studio 2005 SP1.

Оставь ответ

Ваш электронный адрес не будет опубликован. Обязательные поля помечены *