MOSS: Funktionsdygtige eksempel – brugerdefineret datatype

Forretningsscenario:

Enterprise-wide gennemførelsen af mos for produktionsvirksomhed med 30+ websteder og et par dusin corporate afdelinger.

Business mål:

Trods et væld af erhvervslivet grupper (afdelinger, Steder, osv), visse data bør bevares på globalt plan. For eksempel, en autoritativ master liste over alle fysiske placeringer af virksomheden (strømsparetilstand. produktionsfaciliteter, lagerlokationer, salgskontorer) bør fastholdes i en central beliggenhed.

Teknisk Problem:

Enterprise taksonomien blev gennemført ved hjælp af flere grupper af websteder. Vi ville gerne oprette den autoritative liste over fysiske lokationer i en brugerdefineret WSS liste. Derefter, Når vi skulle have en kolonne i en indholdstype (eller en kolonne føjes til en liste eller doc bibliotek) der indeholdt corporate steder, Vi ville skabe en kolonne ved hjælp af "opslag" datatype og pege på denne hovedliste.

Desværre, opslag datatyper skal have adgang til en kildeliste "lokalt" hvilket betyder at vores autoritative liste ikke kan span websteder.

Tekniske løsning:

Implementer en ny brugerdefineret datatype implementeret baseret på SPField og repræsenteret som en DropDownList i UI hvis ListItems udfylde WSS-listen master.

Vi skabt en ny gruppe af websteder kaldes "http://localhost/EnterpriseData". Der, Vi har oprettet en brugerdefineret liste navngivne "Corporate placeringer". Denne liste bruger bare den standard "titel" Feltet indeholder en liste over faktiske corporate placeringer.

Man følger flere diskrete trin for at oprette en brugerdefineret datatype i WSS. De er:

  1. Definere en klasse som nedarver fra SPField (man kan arve fra andre områder, hvis det kræves).

Her er koden for at:

offentlige klasse XYZZYCorporateLocationField : SPFieldText
{
offentlige XYZZYCorporateLocationField
(Af SPFieldCollection felter, streng typeName, streng displayName)
: Base(felter, typeName, displayName) { }

offentlige XYZZYCorporateLocationField
(Af SPFieldCollection felter, streng displayName)
: Base(felter, displayName) { }

offentlige tilsidesætte BaseFieldControl FieldRenderingControl
{

{
BaseFieldControl kontrol = nye XYZZYCorporateLocationFieldControl();
kontrol. FieldName = Dette.InternalName;
tilbagevenden kontrol;
} //få
} // fieldrenderingcontrol

offentlige tilsidesætte streng GetValidatedString(objekt værdi)
{
Hvis (Dette.Kræves || værdi. ToString().Er lig med(Streng.Tom))
{
kaste nye SPFieldValidationException ("Afdeling er ikke tildelt.");
}
tilbagevenden Base.GetValidatedString(værdi);
} // getvalidatedstring

} // XYZZYCorporateLocation

  1. Definere en anden klasse, der nedarver fra kontrolelementet Grundfelt, som i:

offentlige klasse XYZZYCorporateLocationFieldControl : BaseFieldControl
{
beskyttet DropDownList XYZZYCorporateLocationSelector;

beskyttet tilsidesætte streng DefaultTemplateName
{

{
tilbagevenden "XYZZYCorporateLocationFieldControl";
}
} // DefaultTemplateName

offentlige tilsidesætte objekt Værdi
{

{
EnsureChildControls();
tilbagevenden Dette.XYZZYCorporateLocationSelector. SelectedValue;
} // få
sæt
{
EnsureChildControls();
Dette.XYZZYCorporateLocationSelector.SelectedValue = (streng)Dette.ItemFieldValue;
} // sæt
} // tilsidesætte objekt værdi

beskyttet tilsidesætte void CreateChildControls()
{

Hvis (Dette.Feltet == Null || Dette.ControlMode == SPControlMode.Display)
tilbagevenden;

Base.CreateChildControls();

Dette.XYZZYCorporateLocationSelector =
(DropDownList)TemplateContainer. FindControl("XYZZYCorporateLocationSelector");

Hvis (Dette.XYZZYCorporateLocationSelector == Null)
kaste nye Undtagelse("FEJL: Kan ikke indlæse. ASCX fil!");

Hvis (!Dette.IsPostBack side.)
{

ved hjælp af (SPSite site = nye SPSite("http://localhost/enterprisedata"))
{
ved hjælp af (SPWeb Web = site. OpenWeb())
{

SPList.Update() currentList = web. Lister["Corporate steder"];

foreach (SPItem XYZZYCorporateLocation i currentList.Items)
{
Hvis (XYZZYCorporateLocation["Titel"] == Null) «««;

streng theTitle;
theTitle = XYZZYCorporateLocation["Titel"].ToString();

Dette.XYZZYCorporateLocationSelector.Items.Add
(nye ListItem(theTitle, theTitle));

} // foreach

} // ved hjælp af spweb web = site.openweb()
} // ved hjælp af spsite site = ny spsite("http://localhost/enterprisedata")

} // Hvis ikke en tilbagesendelse

} // CreateChildControls

} // XYZZYCorporateLocationFieldControl

Ovenstående kode dybest set implementerer logik til udfyldning af DropDownList med værdier fra den WSS brugerdefinerede liste findes på http://localhost/enterprisedata og navngivet "Corporate afdelinger".

Jeg defineret begge klasser i en enkelt .cs fil, kompileret det og sætte det ind i GAC (stærk kræves, Selvfølgelig).

  1. Gennemføre en kontrol skabelon (.ascx) som vist:

<%@ Kontrol Sprog= "C#" Arver="Microsoft.SharePoint.Portal.ServerAdmin.CreateSiteCollectionPanel1,Microsoft.SharePoint.Portal,Version = 12.0.0.0, kultur = neutral,PublicKeyToken = 71e9bce111e9429c" compilationMode= "Altid" %>
<%
@ Registrer TagPrefix= "wssawc" Namespace="Microsoft.SharePoint.webControls" Forsamling="Microsoft.SharePoint, Version = 12.0.0.0, Kultur = neutral, PublicKeyToken = 71e9bce111e9429c" %> <%@ Registrer TagPrefix= "SharePoint" Namespace="Microsoft.SharePoint.webControls" Forsamling="Microsoft.SharePoint, Version = 12.0.0.0, Kultur = neutral, PublicKeyToken = 71e9bce111e9429c" %>
<SharePoint:RenderingTemplate ID= "XYZZYCorporateLocationFieldControl" RUNAT= "server">
<Skabelon>
<ASP:DropDownList ID= "XYZZYCorporateLocationSelector" RUNAT= "serveren" />
</Skabelon>
</
SharePoint:RenderingTemplate>

Ovenstående er gemt i c:\programmet fælles filer filesmicrosoft sharedweb server extensions12controltemplates.

  1. Endelig, vi oprette en XML-fil til at gemme i det... 12XML Register. Dette er CAML, der definerer vores brugerdefineret datatype og for mit eksempel, ser sådan ud:

<?XML version="1.0" kodning="UTF-8" ?>
<
Felttyper>
<
FieldType>
<
Felt Navn="TypeName">CorporateLocations</Felt>
<
Felt Navn="Felttypen">Tekst</Felt>
<
Felt Navn="TypeDisplayName">Corporate steder</Felt>
<
Felt Navn="TypeShortDescription">Alle XYZZY Corporate steder herunder fremstillings- eller andre faciliteter.</Felt>
<
Felt Navn="UserCreatable">SANDT</Felt>
<
Felt Navn="ShowInListCreate">SANDT</Felt>
<
Felt Navn="ShowInDocumentLibraryCreate">SANDT</Felt>
<
Felt Navn="ShowInSurveyCreate">SANDT</Felt>
<
Felt Navn="ShowInColumnTemplateCreate">SANDT</Felt>
<
Felt Navn="FieldTypeClass">Conchango.XYZZYCorporateLocationField, XYZZYCorporateLocationField, Version = 1.0.0.0, Kultur = neutral, PublicKeyToken = b0b19e85410990c4</Felt>
<
RenderPattern Navn="DisplayPattern">
<
Switch>
<
Udtryk>
<
Kolonne />
</
Udtryk>

<Sag Værdi=""/>

<Standard>
<
HTML>
<![CDATA[
<span style = "color:Rød"><b>]]>
</
HTML>

<
Kolonne SubColumnNumber="0" HTMLEncode="SANDT"/>

<HTML><![CDATA[</b></span>]]></HTML>

</
Standard>
</
Switch>

</
RenderPattern>
</
FieldType>
</
Felttyper>
Denne XML-fil, tilføjer den brugerdefinerede datatype til WSS "bibliotek" og passer det ind i GAC havde forsamling.

Når du har flyttet alle disse bits på plads, iisreset på serveren, og det bør alle start arbejder pænt.

3 tanker om ”MOSS: Funktionsdygtige eksempel – brugerdefineret datatype

  1. Alejandro
    Hej Paul,
    Først og fremmest, Tak nemlig paragraf, fordi det er meget interessant. Kun ét spørgsmål;
    Kender du, hvis det er muligt at gengive korrekt typen brugerdefineret felt i dataarkvisning af en liste?
    Fordi hvert brugerdefineret felttype jeg oprette det er vist som skrivebeskyttet i dataarkvisning (og MSDN, for eksempel, ikke hjælpe mig meget :-S).
    Tak
    Svar
  2. Lyndsay
    Regnede det! Bare brug for at tilføje

    ved hjælp af System.Web.UI;
    ved hjælp af System.Web.UI.WebControls;

    Svar
  3. Lyndsay

    Jeg forsøger at gennemføre din løsning. Men jeg i stedet for DropDownList, Jeg har kun mulighed for en DropDownChoiceList. Du har tilfældigvis at vide, hvordan du føjer elementer til en DropDownChoiceList? Vi bruger SharePoint 2007 SP1 og Visual Studio 2005 SP1.

    Svar

Efterlad et svar

Din e-mail adresse vil ikke blive offentliggjort. Krævede felter er markeret *