МОС: Функционални пример-потребителски тип данни

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

Предприятието изпълнението на Мос за производствена компания с 30+ сайтове и няколко десетки корпоративни отдели.

Бизнес цел:

Въпреки множество бизнес групи (отдели, места, н), някои данни трябва да се поддържа в световен мащаб. За пример, авторитетен главен списък на всички физически места на компанията (e.g. производствените мощности, складови местоположения, офиси за продажба) трябва да се поддържа на централно място.

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

В класификацията на предприятието е било изпълнено с помощта на няколко колекции от сайтове. Бихме искали да се създаде достоверен списък на физически места в WSS списък по избор. След това, когато ние трябва да има колона в типа съдържание (или колона добавя към списък или документ библиотека) които съдържат корпоративни места, Ние ще създадете колона с помощта на справката"" тип данни и точка за този главен списък.

За съжаление, Търсене типове данни трябва да имат достъп до източник списък "локално" което означава, че нашите достоверен списък не може да заема колекции от сайтове.

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

Прилага нов потребителски тип данни прилагат въз основа на SPField и представени като DropDownList в UI, чиито ListItems пренесат от главния списък на WSS.

Ние създадохме нова колекция от сайтове се нарича "http://localhost/EnterpriseData". Там, Ние създадохме списък по избор, наречена "Корпоративни места". Този списък само използва стандартната "заглавие" поле да съдържа списък на действителните корпоративни места.

Една следва няколко дискретни стъпки, за да създадете потребителски тип данни в WSS. Те са:

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

Тук е кодът за тази:

обществени клас XYZZYCorporateLocationField : SPFieldText
{
обществени XYZZYCorporateLocationField
(SPFieldCollection полета, низ typeName, низ Показвано име)
: база(полета, typeName, Показвано име) { }

обществени XYZZYCorporateLocationField
(SPFieldCollection полета, низ Показвано име)
: база(полета, Показвано име) { }

обществени замени BaseFieldControl FieldRenderingControl
{
Вземи
{
BaseFieldControl контрол = нов XYZZYCorporateLocationFieldControl();
контрол. FieldName = Това.InternalName;
връщане контрол;
} //Вземи
} // fieldrenderingcontrol

обществени замени низ GetValidatedString(обект стойност)
{
Ако (Това.Изисква || стойност. ToString().Е равно(Низ.Празен))
{
хвърлят нов SPFieldValidationException ("Отдел не е присвоен.");
}
връщане база.GetValidatedString(стойност);
} // getvalidatedstring

} // XYZZYCorporateLocation

  1. Дефиниране на друг клас, който наследява от базовото поле контрола, както и в:

обществени клас XYZZYCorporateLocationFieldControl : BaseFieldControl
{
защитен DropDownList XYZZYCorporateLocationSelector;

защитен замени низ DefaultTemplateName
{
Вземи
{
връщане "XYZZYCorporateLocationFieldControl";
}
} // DefaultTemplateName

обществени замени обект Стойност
{
Вземи
{
EnsureChildControls();
връщане Това.XYZZYCorporateLocationSelector.SelectedValue;
} // Вземи
комплект
{
EnsureChildControls();
Това.XYZZYCorporateLocationSelector.SelectedValue = (низ)Това.ItemFieldValue;
} // комплект
} // замени обект стойност

защитен замени невалидни CreateChildControls()
{

Ако (Това.Поле == Null || Това.ControlMode == SPControlMode.Показване)
връщане;

база.CreateChildControls();

Това.XYZZYCorporateLocationSelector =
(DropDownList)TemplateContainer. FindControl("XYZZYCorporateLocationSelector");

Ако (Това.XYZZYCorporateLocationSelector == Null)
хвърлят нов Изключение("ГРЕШКА: Не може да зареди. ASCX файл!");

Ако (!Това.IsPostBack страница.)
{

използване на (SPSite сайт = нов SPSite("http://Localhost/enterprisedata"))
{
използване на (SPWeb уеб = сайт. OpenWeb())
{

Splist.Update() currentList = web. Списъци["Корпоративни места"];

foreach (SPItem XYZZYCorporateLocation в currentList.Items)
{
Ако (XYZZYCorporateLocation["Заглавие"] == Null) «««;

низ theTitle;
theTitle = XYZZYCorporateLocation["Заглавие"].ToString();

Това.XYZZYCorporateLocationSelector.Items.Add
(нов Елемент от списък(theTitle, theTitle));

} // foreach

} // използване на spweb web = site.openweb()
} // използвайки spsite сайт = нови spsite("http://Localhost/enterprisedata")

} // Ако не обратното публикуване

} // CreateChildControls

} // XYZZYCorporateLocationFieldControl

По-горе код основно изпълнява на логиката за попълване на списъка със стойности от WSS потребителски списък, намиращ се на http://localhost/enterprisedata и име "корпоративни отдели".

Аз определено и двата класа в един .cs файл, изготвя и я поставете в GAC (силна изисква, Разбира се).

  1. Изпълнение на контролен шаблон (.ascx) както е показано:

<%@ Контрол Език= "C#" Наследява="Microsoft.SharePoint.Portal.ServerAdmin.CreateSiteCollectionPanel1,Microsoft.SharePoint.Portal,Версия = 12.0.0.0, култура = неутрална,PublicKeyToken = 71e9bce111e9429c" compilationMode= "Винаги" %>
<%
@ Регистрирайте се Tagprefix= "wssawc" Namespace="Microsoft.SharePoint.WebControls" Събрание="Microsoft.SharePoint, Версия = 12.0.0.0, Култура = неутрална, PublicKeyToken = 71e9bce111e9429c" %> <%@ Регистрирайте се Tagprefix= "SharePoint" Namespace="Microsoft.SharePoint.WebControls" Събрание="Microsoft.SharePoint, Версия = 12.0.0.0, Култура = неутрална, PublicKeyToken = 71e9bce111e9429c" %>
<SharePoint:Шаблона за рендиране ИД= "XYZZYCorporateLocationFieldControl" RunAt= "сървър">
<Шаблон>
<ASP:DropDownList ИД= "XYZZYCorporateLocationSelector" RunAt= "сървър" />
</Шаблон>
</
SharePoint:Шаблона за рендиране>

По-горе се записва в c:\Програмата filescommon filesmicrosoft споделениуеб сървър 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">
<
Превключване>
<
Израз>
<
Колона />
</
Израз>

<Дело Стойност=""/>

<По подразбиране>
<
HTML>
<![НЕЗАТВОРЕН[
<педя стил = "цвят:Червен"><б>]]>
</
HTML>

<
Колона SubColumnNumber="0" HTMLEncode="ВЯРНО"/>

<HTML><![НЕЗАТВОРЕН[</б></еталониране>]]></HTML>

</
По подразбиране>
</
Превключване>

</
RenderPattern>
</
FieldType>
</
Полета FieldTypes>
Този XML файл добавя потребителски тип данни за вик "Библиотека" и го мачове срещу GAC имаше събрание.

След преместването на всички тези битове на място, iisreset на сървъра и че всички трябва да започнете добре работи.

3 мисли за "МОС: Функционални пример-потребителски тип данни

  1. Alejandro
    Здравей Пол,
    Преди всичко, Благодаря за статията, защото това е много интересно. Само един въпрос;
    Знаете ли, ако това е posible към отплащам с правилен тип на поле по избор в изгледа на списък?
    Защото всеки потребителски тип създам, че се показва само за четене в изглед на лист с данни (и MSDN, за пример, не ми помогне много :-S).
    Благодаря
  2. Lyndsay
    Го измисли! Просто трябваше да добавите

    използване на System.Web.UI;
    използване на System.Web.UI.WebControls;

  3. Lyndsay

    Аз съм се опитват да приложат вашето решение. Обаче аз вместо DropDownList, Имам само опцията за DropDownChoiceList. Да ти се случи да знаете как да добавите елементи към DropDownChoiceList? Ние се използва SharePoint 2007 SP1 и Visual Studio 2005 SP1.

Оставете отговор

Вашият имейл адрес няма да бъде публикуван. Задължителните полета са отбелязани *