MOSS: Funktionella exempel-anpassad datatyp

Affärsscenario:

Enterprise-wide genomförandet av MOSS för tillverkande företag med 30+ platser och några dussin företagens avdelningar.

Verksamhetsmål:

Trots en mängd företagsgrupper (avdelningar, platser, m.m.), vissa uppgifter bör behållas på en global nivå. Till exempel, en auktoritativ Ledar-lista av alla fysiska platser av företaget (t.ex. tillverkningsanläggningar, lagerställen, försäljningskontor) bör behållas på en central plats.

Tekniska Problem:

Företaget taxonomin genomfördes med flera webbplatssamlingar. Vi skulle ha velat skapa en auktoritär lista över fysiska platser i en anpassad lista som WSS. Sedan, När vi behövde ha en kolumn i en innehållstyp (eller en kolumn läggs till en lista eller doc dokumentbibliotek) som innehöll corporate platser, Vi vill skapa en kolumn med "lookup" datatyp och peka på det Ledar-lista.

Tyvärr, lookup datatyper måste komma åt en källista "lokalt" vilket innebär att vår auktoritär lista inte kan span webbplatssamlingar.

Teknisk lösning:

Genomföra en ny anpassad datatyp genomförs utifrån SPField och representeras av en DropDownList i Gränssnittet vars ListItems fylla i master WSS-listan.

Vi skapade en ny webbplatssamling som kallas "http://localhost/EnterpriseData". Det, Vi skapade en anpassad lista som heter "Corporate platser". Denna lista använder bara standard "titeln" fältet innehåller en lista över faktiska corporate platser.

Följer en flera diskreta steg för att skapa en anpassad datatyp i WSS. De är:

  1. Definiera en klass som ärver från SPField (man kan ärva från andra fält om det behövs).

Här är koden för att:

offentliga klass XYZZYCorporateLocationField : SPFieldText
{
offentliga XYZZYCorporateLocationField
(SPFieldCollection fält, sträng typeName, sträng displayName)
: base(fält, typeName, displayName) { }

offentliga XYZZYCorporateLocationField
(SPFieldCollection fält, sträng displayName)
: base(fält, displayName) { }

offentliga åsidosätta BaseFieldControl FieldRenderingControl
{

{
BaseFieldControl kontroll = nya XYZZYCorporateLocationFieldControl();
kontroll. Fältnamn = Detta.InternalName;
återvändande kontroll;
} //få
} // fieldrenderingcontrol

offentliga åsidosätta sträng GetValidatedString(objekt värde)
{
om (Detta.Krävs || värdet. ToString().Är lika med(Sträng.Tom))
{
kasta nya SPFieldValidationException ("Avdelningen är inte tilldelad.");
}
återvändande base.GetValidatedString(värde);
} // getvalidatedstring

} // XYZZYCorporateLocation

  1. Definiera en annan klass som ärver från fältkontroll, som i:

offentliga klass XYZZYCorporateLocationFieldControl : BaseFieldControl
{
skyddade DropDownList XYZZYCorporateLocationSelector;

skyddade åsidosätta sträng DefaultTemplateName
{

{
återvändande "XYZZYCorporateLocationFieldControl";
}
} // DefaultTemplateName

offentliga åsidosätta objekt Värde
{

{
EnsureChildControls();
återvändande Detta.XYZZYCorporateLocationSelector. SelectedValue;
} // få
Ange
{
EnsureChildControls();
Detta.XYZZYCorporateLocationSelector.SelectedValue = (sträng)Detta.ItemFieldValue;
} // Ange
} // åsidosätta objektet värdet

skyddade åsidosätta void CreateChildControls()
{

om (Detta.Fältet == null || Detta.ControlMode == SPControlMode.Display)
återvändande;

base.CreateChildControls();

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

om (Detta.XYZZYCorporateLocationSelector == null)
kasta nya Undantag("FEL: Kan inte ladda. ASCX fil!");

om (!Detta.IsPostBack sida.)
{

med hjälp av (SPSite plats = nya SPSite("http://localhost/enterprisedata"))
{
med hjälp av (SPWeb Web = webbplats. OpenWeb())
{

SPList currentList = web. Listor["Corporate platser"];

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

sträng Ämneskod;
Ämneskod = XYZZYCorporateLocation["Rubrik"].ToString();

Detta.XYZZYCorporateLocationSelector.Items.Add
(nya ListItem(Ämneskod, Ämneskod));

} // foreach

} // med hjälp av spweb web = site.openweb()
} // webbplatsen för spsite = nya spsite("http://localhost/enterprisedata")

} // om inte ett återanslående

} // CreateChildControls

} // XYZZYCorporateLocationFieldControl

Ovanstående kod i princip implementerar logik för att fylla DropDownList med värden från WSS anpassade listan ligger på http://localhost/enterprisedata och heter "företagens avdelningar".

Jag definierade båda klasserna i en enda .cs fil, sammanställt det och Lägg den i den globala Sammansättningscachen (stark krävs, Självklart).

  1. Genomföra en kontrollmall (.ascx) som visas:

<%@ Kontroll Språk= "C#" Ärver="Microsoft.SharePoint.Portal.ServerAdmin.CreateSiteCollectionPanel1,Microsoft.SharePoint.Portal,Version = 12.0.0.0, kultur = neutral,PublicKeyToken = 71e9bce111e9429c" compilationMode= "Alltid" %>
<%
@ Registrera dig TagPrefix= "wssawc" Namespace="Microsoft.SharePoint.WebControls" Församling="Microsoft.SharePoint, Version = 12.0.0.0, Kultur = neutral, PublicKeyToken = 71e9bce111e9429c" %> <%@ Registrera dig TagPrefix= "SharePoint" Namespace="Microsoft.SharePoint.WebControls" Församling="Microsoft.SharePoint, Version = 12.0.0.0, Kultur = neutral, PublicKeyToken = 71e9bce111e9429c" %>
<SharePoint:RenderingTemplate ID= "XYZZYCorporateLocationFieldControl" Runat= "server">
<Mall>
<ASP:DropDownList ID= "XYZZYCorporateLocationSelector" Runat= "server" />
</Mall>
</
SharePoint:RenderingTemplate>

Ovanstående sparas in c:\programmet delade filerMicrosoft sharedweb server extensions12controltemplates.

  1. Slutligen, Vi skapar en XML-fil att spara i det... 12XML katalog. Detta är CAML som definierar våra anpassad datatyp och för mitt exempel, ser ut så här:

<?XML version="1.0" kodning="UTF-8" ?>
<
FieldTypes>
<
FieldType>
<
Fältet Namn="TypeName">CorporateLocations</Fältet>
<
Fältet Namn="ParentType">Texten</Fältet>
<
Fältet Namn="TypeDisplayName">Corporate platser</Fältet>
<
Fältet Namn="TypeShortDescription">Alla XYZZY Corporate platser inklusive tillverkning eller andra anläggningar.</Fältet>
<
Fältet Namn="UserCreatable">SANNA</Fältet>
<
Fältet Namn="ShowInListCreate">SANNA</Fältet>
<
Fältet Namn="ShowInDocumentLibraryCreate">SANNA</Fältet>
<
Fältet Namn="ShowInSurveyCreate">SANNA</Fältet>
<
Fältet Namn="ShowInColumnTemplateCreate">SANNA</Fältet>
<
Fältet Namn="FieldTypeClass">Conchango.XYZZYCorporateLocationField, XYZZYCorporateLocationField, Version = 1.0.0.0, Kultur = neutral, PublicKeyToken = b0b19e85410990c4</Fältet>
<
RenderPattern Namn="DisplayPattern">
<
Switch>
<
Expr>
<
Kolumn />
</
Expr>

<Fallet Värde=""/>

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

<
Kolumn SubColumnNumber="0" HTMLEncode="SANNA"/>

<HTML><![CDATA[</b></Spänn>]]></HTML>

</
Standard>
</
Switch>

</
RenderPattern>
</
FieldType>
</
FieldTypes>
XML-filen lägger till en anpassad datatyp till WSS "bibliotek" och matchar det upp mot GAC hade församlingen.

Efter att ha flyttat alla dessa bitar på plats, iisreset på servern och det bör alla börja arbeta fint.

3 tankar på "MOSS: Funktionella exempel-anpassad datatyp

  1. Alejandro
    Hej Paul,
    Först av allt, Tack för artikeln, eftersom det är mycket intressant. Bara en fråga;
    Vet du om det är möjligt att återge korrekt typen anpassat fält i databladsvyn i en lista?
    Eftersom varje typ av anpassat fält jag skapa det är visas som skrivskyddade i databladsvyn (och MSDN, till exempel, hjälper mig inte så mycket :-S).
    Tack
    Svar
  2. Lyndsay

    Jag försöker att genomföra din lösning. Men jag istället för DropDownList, Jag har bara alternativet för en DropDownChoiceList. Råkar du veta hur du lägger till poster till en DropDownChoiceList? Vi använder SharePoint 2007 SP1 och Visual Studio 2005 SP1.

    Svar

Lämna svar

Din e-postadress kommer inte att publiceras. behövliga fält är markerade *