MOSS: Funksjonell eksempel-egendefinert datatype

Virksomhet Scenario:

Factory-bred implementering av MOSS for produksjonsbedrift med 30+ områder og et par dusin corporate avdelinger.

Forretningsmål:

Til tross for en rekke virksomhet grupper (avdelinger, steder, osv.), visse data bør opprettholdes på et globalt nivå. For eksempel, en autoritativ hovedliste over alle fysiske plasseringer av selskapet (f.eks. produksjonsanlegg, lagerlokasjoner, salgskontor) bør opprettholdes sentralt.

Teknisk Problem:

Enterprise taksonomien ble implementert ved hjelp av flere områdesamlinger. Vi ville ha likt å opprette autoritative listen over fysiske plasseringer i en egendefinert WSS-liste. Deretter, Når vi måtte ha en kolonne i en innholdstype (eller en kolonne lagt til en liste eller doc dokumentbibliotek) som inneholdt corporate steder, Vi vil skape en kolonne ved hjelp av oppslaget"" datatype og punkt til denne hovedlisten.

Dessverre, Oppslag datatyper må vise en kildeliste "lokalt" betyr at vår autoritative liste ikke kan dekke områdesamlinger.

Teknisk løsning:

Implementere en ny egendefinert datatype gjennomført basert på SPField og representert som en DropDownList i Brukergrensesnittet som ListItems Fyll fra WSS liste.

Vi laget en ny områdesamling kalt "http://localhost/EnterpriseData". Det, Vi har opprettet en egendefinert liste kalt "Corporate Locations". Denne listen bruker bare standard "tittel" feltet inneholder listen over faktiske corporate steder.

En følger flere separate trinn for å opprette en egendefinert datatype i WSS. De er:

  1. Definere en klasse som arver fra SPField (man kan arve fra andre felt hvis nødvendig).

Her er koden for det:

offentlig klassen XYZZYCorporateLocationField : SPFieldText
{
offentlig XYZZYCorporateLocationField
(SPFieldCollection felt, streng typeName, streng displayName)
: Base(felt, typeName, displayName) { }

offentlig XYZZYCorporateLocationField
(SPFieldCollection felt, streng displayName)
: Base(felt, displayName) { }

offentlig overstyre BaseFieldControl FieldRenderingControl
{

{
BaseFieldControl kontroll = nye XYZZYCorporateLocationFieldControl();
kontroll. Feltnavn = Dette.InternalName;
avkastning kontroll;
} //få
} // fieldrenderingcontrol

offentlig overstyre streng GetValidatedString(objekt verdi)
{
Hvis (Dette.Kreves || verdi. ToString().Er lik(Streng.Tom))
{
kaste nye SPFieldValidationException ("Avdelingen er ikke tilordnet.");
}
avkastning Base.GetValidatedString(verdi);
} // getvalidatedstring

} // XYZZYCorporateLocation

  1. Definere en klasse som arver fra kontrollen Basisfelt, som i:

offentlig klassen XYZZYCorporateLocationFieldControl : BaseFieldControl
{
beskyttet DropDownList XYZZYCorporateLocationSelector;

beskyttet overstyre streng DefaultTemplateName
{

{
avkastning "XYZZYCorporateLocationFieldControl";
}
} // DefaultTemplateName

offentlig overstyre objekt Verdi
{

{
EnsureChildControls();
avkastning Dette.XYZZYCorporateLocationSelector.SelectedValue;
} // få
Sett
{
EnsureChildControls();
Dette.XYZZYCorporateLocationSelector.SelectedValue = (streng)Dette.ItemFieldValue;
} // Sett
} // Overstyr object verdi

beskyttet overstyre ugyldige CreateChildControls()
{

Hvis (Dette.Feltet == null || Dette.ControlMode == SPControlMode.Skjerm)
avkastning;

Base.CreateChildControls();

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

Hvis (Dette.XYZZYCorporateLocationSelector == null)
kaste nye Unntak("FEIL: Kan ikke laste. ASCX-fil!");

Hvis (!Dette.IsPostBack side.)
{

ved hjelp av (SPSite Site = nye SPSite("http://localhost/enterprisedata"))
{
ved hjelp av (SPWeb Web = området. OpenWeb())
{

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

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

streng Spørringsresultat;
Spørringsresultat = XYZZYCorporateLocation["Tittel"].ToString();

Dette.XYZZYCorporateLocationSelector.Items.Add
(nye ListItem(Spørringsresultat, Spørringsresultat));

} // foreach

} // bruke spweb web = site.openweb()
} // bruke spsite siden = nye spsite("http://localhost/enterprisedata")

} // Hvis ikke en tilbakesending

} // CreateChildControls

} // XYZZYCorporateLocationFieldControl

Ovenfor koden i utgangspunktet implementerer logikken fyller DropDownList med verdier fra WSS egendefinerte listen på http://localhost/enterprisedata og navngitte "Corporate avdelinger".

Jeg definert begge klassene i en enkelt .cs fil, samlet og putte den i GAC (sterk kreves, selvfølgelig).

  1. Implementere en kontrollmal (.ascx) som vist:

<%@ Kontroll Språk= "C#" Arver="Microsoft.SharePoint.Portal.ServerAdmin.CreateSiteCollectionPanel1,Microsoft.SharePoint.Portal,Versjon = 12.0.0.0, kultur = nøytral,PublicKeyToken = 71e9bce111e9429c" compilationMode= "Alltid" %>
<%
@ Registrering TagPrefix= "wssawc" Namespace="Microsoft.SharePoint.webControls" Montering="Microsoft.SharePoint, Versjon = 12.0.0.0, Culture = neutral, PublicKeyToken = 71e9bce111e9429c" %> <%@ Registrering TagPrefix= "SharePoint" Namespace="Microsoft.SharePoint.webControls" Montering="Microsoft.SharePoint, Versjon = 12.0.0.0, Culture = neutral, PublicKeyToken = 71e9bce111e9429c" %>
<SharePoint:Gjengivelsesmalen ID= "XYZZYCorporateLocationFieldControl" RUNAT= "server">
<Mal>
<ASP:DropDownList ID= "XYZZYCorporateLocationSelector" RUNAT= "server" />
</Mal>
</
SharePoint:Gjengivelsesmalen>

Ovenfor lagres i c:\programmet filescommon filesmicrosoft sharedweb server extensions12controltemplates.

  1. Endelig, vi opprette en XML-fil til å lagre i den... 12XML katalogen. Dette er CAML som definerer våre egendefinert datatype og mitt eksempel, ser slik ut:

<?XML versjon="1.0" koding="UTF-8" ?>
<
FieldTypes>
<
FieldType>
<
Feltet navn="TypeName">CorporateLocations</Feltet>
<
Feltet navn="ParentType">Tekst</Feltet>
<
Feltet navn="TypeDisplayName">Corporate steder</Feltet>
<
Feltet navn="TypeShortDescription">Alle XYZZY Corporate steder inkludert produksjons- eller andre anlegg.</Feltet>
<
Feltet navn="UserCreatable">SANT</Feltet>
<
Feltet navn="ShowInListCreate">SANT</Feltet>
<
Feltet navn="ShowInDocumentLibraryCreate">SANT</Feltet>
<
Feltet navn="ShowInSurveyCreate">SANT</Feltet>
<
Feltet navn="ShowInColumnTemplateCreate">SANT</Feltet>
<
Feltet navn="FieldTypeClass">Conchango.XYZZYCorporateLocationField, XYZZYCorporateLocationField, Versjon = 1.0.0.0, Culture = neutral, PublicKeyToken = b0b19e85410990c4</Feltet>
<
RenderPattern navn="DisplayPattern">
<
Bryteren>
<
Uttr>
<
Kolonne />
</
Uttr>

<Saken Verdi=""/>

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

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

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

</
Standard>
</
Bryteren>

</
RenderPattern>
</
FieldType>
</
FieldTypes>
Denne XML-filen legger til den egendefinerte datatypen WSS "bibliotek" og matcher den mot GAC hadde montering.

Flyttet alle bitene på plass, iisreset på serveren, og det bør alle starte fungerer fint.

3 tanker om “MOSS: Funksjonell eksempel-egendefinert datatype

  1. Alejandro
    Hei Paul,
    først og fremst, Takk for artikkelen, fordi det er veldig interessant. Bare ett spørsmål;
    Vet du om det er mulig å render korrekt en egendefinert felttype i dataarkvisning av en liste?
    Fordi hver egendefinert felttype jeg opprette den vises som skrivebeskyttet i dataarkvisning (og MSDN, for eksempel, ikke hjelpe meg takk :-S).
    takk
    Svar
  2. Lyndsay
    Beregnet den ut! Rettferdig behøvde å sammenlegge

    bruke System.Web.UI;
    bruke System.Web.UI.WebControls;

    Svar
  3. Lyndsay

    Jeg prøver å implementere løsningen. Men jeg i stedet for DropDownList, Jeg har bare alternativet for en DropDownChoiceList. Skje dere vite hvordan du legger elementer til en DropDownChoiceList? Vi bruker SharePoint 2007 SP1 og Visual Studio 2005 SP1.

    Svar

legg igjen et svar

e-postadressen din vil ikke offentliggjøres. Obligatoriske felt er merket *