Мос: Функционални Пример - сопствени податоци Тип

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

Претпријатие-широк имплементација на Мос за производство на компанијата со 30+ сајтови и неколку десетици корпоративни сектори.

Бизнис Цел:

И покрај мноштво на бизнис-групи (одделенија, локации, итн), одредени податоци треба да се одржува на глобално ниво. На пример, авторитетен господар листа на сите физички локации на компанијата (e.g. производствени капацитети, складиште локации, продажбата на канцеларии) треба да се одржува во една централна локација.

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

На претпријатието таксономија беше имплементиран со користење на повеќе сајт колекции. Ние би сакал да се создаде авторитетен листа на физички локации во сопствен WSS листа. Потоа, кога ни е потребно да имаме колона во типот на содржина (или колона додадена на листа или doc библиотека) кои се содржани корпоративни локации, we would create a column using the "lookup" тип на податоци и точка за овој господар листа.

За жал, lookup datatypes must access a source list "locally" што значи дека нашите авторитетен листа не може да span сајт колекции.

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

Спроведе нова сопствен тип на податок спроведува врз основа на SPField и претставен како DropDownList во корисничкиот интерфејс, чии ListItems доверат од WSS господар листа.

Ние направивме нов сајт колекција наречена "http://localhost/EnterpriseData". Има, we created a custom list named "Corporate Locations". This list just uses the standard "Title" поле ги содржи листа на вистинските корпоративниот локации.

Се следат неколку дискретни чекори за да креирате сопствени тип на податоци во WSS. Тие се:

  1. Се дефинира класа која наследува од SPField (може да се наследат од други области ако е потребно).

Еве го кодот за тоа:

јавноста класа XYZZYCorporateLocationField : SPFieldText
{
јавноста XYZZYCorporateLocationField
(SPFieldCollection полиња, низа typeName, низа displayName)
: база(полиња, typeName, displayName) { }

јавноста XYZZYCorporateLocationField
(SPFieldCollection полиња, низа displayName)
: база(полиња, displayName) { }

јавноста избегне BaseFieldControl FieldRenderingControl
{
добие
{
BaseFieldControl control = нови XYZZYCorporateLocationFieldControl();
control.FieldName = овој.Внатрешна Име;
се врати control;
} //добие
} // fieldrenderingcontrol

јавноста избегне низа GetValidatedString(објект вредност)
{
ако (овој.Required || value.ToString().Еднакво(Стринг.Празни))
{
фрли нови SPFieldValidationException ("Department is not assigned.");
}
се врати база.GetValidatedString(вредност);
} // getvalidatedstring

} // XYZZYCorporateLocation

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

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

заштитени избегне низа DefaultTemplateName
{
добие
{
се врати "XYZZYCorporateLocationFieldControl";
}
} // DefaultTemplateName

јавноста избегне објект Вредност
{
добие
{
EnsureChildControls();
се врати овој.XYZZYCorporateLocationSelector.SelectedValue;
} // добие
постави
{
EnsureChildControls();
овој.XYZZYCorporateLocationSelector.SelectedValue = (низа)овој.ItemFieldValue;
} // постави
} // override object Value

заштитени избегне поништат CreateChildControls()
{

ако (овој.Field == нула || овој.ControlMode == SPControlMode.Прикажување)
се врати;

база.CreateChildControls();

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

ако (овој.XYZZYCorporateLocationSelector == нула)
фрли нови Исклучок("ERROR: Cannot load .ASCX file!");

ако (!овој.Page.IsPostBack)
{

користење на (SPSite site = нови SPSite("http://localhost / enterprisedata"))
{
користење на (SPWeb web = site.OpenWeb())
{

SPList currentList = web.Lists["Corporate Locations"];

foreach (Плукаат XYZZYCorporateLocation во currentList.Items)
{
ако (XYZZYCorporateLocation["Title"] == нула) продолжи;

низа theTitle;
theTitle = XYZZYCorporateLocation["Title"].ToString();

овој.XYZZYCorporateLocationSelector.Items.Add
(нови ListItem(theTitle, theTitle));

} // foreach

} // using spweb web = site.openweb()
} // using spsite site = new spsite("http://localhost/enterprisedata")

} // if not a postback

} // CreateChildControls

} // XYZZYCorporateLocationFieldControl

Горенаведените кодот во основа спроведува логика за населувањето на DropDownList со вредности од WSS обичај листа наоѓа на http://localhost/enterprisedata and named "Corporate Departments".

Јас дефинирани двете паралелки во сингл. Cs датотека, Составувач го и ставете го во GAC (силна потребните, се разбира).

  1. Спроведување на контрола дефиниција (.ascx) како што е прикажано:

<%@ Контрола Јазик="C#" Наследува="Microsoft.SharePoint.Portal.ServerAdmin.CreateSiteCollectionPanel1,Microsoft.SharePoint.Portal,Верзија = 12.0.0.0, култура = неутрален,PublicKeyToken = 71e9bce111e9429c" compilationMode="Always" %>
<%
@ Регистрирај се 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:Рендерирање Шаблон Проект="XYZZYCorporateLocationFieldControl" runat="server">
<Дефиниција>
<asp:DropDownList Проект="XYZZYCorporateLocationSelector" runat="server" />
</Дефиниција>
</
SharePoint:Рендерирање Шаблон>

На погоре е зачувана во в:\Program Files заеднички додадени фајлови Мајкрософт Муабет веб сервер екстензии 12 controltemplates.

  1. Конечно, ние создаваме XML датотека за да ја зачувате во ..... 12 XML директориумот. Ова е CAML што ги дефинира нашите сопствени тип на податок и за мојот пример, изгледа вака:

<?XML верзија="1.0" кодирање="UTF-8" ?>
<
FieldTypes>
<
FieldType>
<
Поле Името="TypeName">CorporateLocations</Поле>
<
Поле Името="ParentType">Текст</Поле>
<
Поле Името="TypeDisplayName">Corporate Locations</Поле>
<
Поле Името="TypeShortDescription">All XYZZY Corporate locations including manufacturing or other facilities.</Поле>
<
Поле Името="UserCreatable">ТОЧНО</Поле>
<
Поле Името="ShowInListCreate">ТОЧНО</Поле>
<
Поле Името="ShowInDocumentLibraryCreate">ТОЧНО</Поле>
<
Поле Името="ShowInSurveyCreate">ТОЧНО</Поле>
<
Поле Името="ShowInColumnTemplateCreate">ТОЧНО</Поле>
<
Поле Името="FieldTypeClass">Conchango.XYZZYCorporateLocationField, XYZZYCorporateLocationField, Верзија = 1.0.0.0, Култура = неутрален, PublicKeyToken=b0b19e85410990c4</Поле>
<
RenderPattern Името="DisplayPattern">
<
Префрлате>
<
Expr>
<
Колона />
</
Expr>

<Случај Вредност=""/>

<Стандардно>
<
HTML>
<![CDATA[
<span style="color:Red"><б>]]>
</
HTML>

<
Колона SubcolumnNumber="0" HTMLEncode="ТОЧНО"/>

<HTML><![CDATA[</б></век>]]></HTML>

</
Стандардно>
</
Префрлате>

</
RenderPattern>
</
FieldType>
</
FieldTypes>
This XML file adds the custom data type to the WSS "library" и натпревари до против GAC'd собранието.

По преселувањето сите овие битови во место, iisreset на серверот и сето тоа треба да почне да работи убаво.

3 размислувања за "Мос: Функционални Пример - сопствени податоци Тип

  1. Александар
    Здраво Пол,
    Прво на сите, Ви благодариме за статија, затоа што тоа е многу интересно. Само едно прашање;
    Дали знаете дали тоа е posible за да го направи правилно сопствен терен тип во идна поглед на листа?
    Затоа што секој обичај областа тип I го создаде е прикажан како само за читање во идна видите (и на MSDN, на пример, не да ми помогне многу :-S).
    Благодарение
  2. Lyndsay

    I am attempting to implement your solution. However I instead of DropDownList, I only have the option for a DropDownChoiceList. Do you happen to know how to add items to a DropDownChoiceList? Ние сме користејќи SharePoint 2007 SP1 и Visual Studio 2005 SP1.

Остави Одговори

Вашата е-маил адреса нема да бидат објавени. Задолжителни полиња се означени *