MOSS: Funkcionalno primer-podatkovnim tipom po meri

Poslovni scenarij:

Izvajanje poslovnega MOSS za proizvodno podjetje z 30+ mesta in nekaj deset podjetij oddelkov.

Poslovni cilj:

Kljub množico poslovnih skupin (oddelki, lokacijah, itd), nekatere podatke je treba ohraniti na svetovni ravni. Na primer, avtoritativni glavni seznam vseh fizičnih lokacijah podjetja (npr.. proizvodni objekti, skladiščnih lokacijah, prodajnih mestih) je treba ohraniti v osrednjem mestu.

Tehnične težave:

Podjetje taksonomije je bilo izvedeno z uporabo več različnih zbirk mesta. Mi bi rad, da ustvarite avtoritativno seznam fizičnih lokacijah v WSS seznam po meri. Nato, ko smo potrebovali, da so v stolpcu v vrsto vsebine (ali stolpec dodati seznam ali doc knjižnica) ki vsebuje skupen lokacijah, bomo ustvarili stolpec z uporabo "iskanje" podatkovni tip in točko glavnega seznama.

Na žalost, iskanje podatkovni tipi morajo imeti dostop do vira seznam "lokalno" kar pomeni, da ne more naša avtoritativni seznam span zbirke mest.

Tehnično rešitev:

Izvajati nova vrsta podatkov po meri izvajajo na podlagi SPField in zastopali DropDownList v UI, katerih ListItems zapolnijo od glavnega seznama WSS.

Ustvarili smo novo zbirko mest, imenuje "http://localhost/EnterpriseData". Tam, ustvarili smo poimenovali "Corporate lokacijah" seznam po meri. Ta seznam uporablja samo standardne "naslov" polje vsebuje seznam dejanskih lokacijah podjetja.

Eden sledi več nepovezanih korakov ustvariti s podatkovnim tipom po meri v WSS. So:

  1. Določite razred, ki deduje od SPField (Eden lahko podedujejo od drugih področjih, če zahtevati).

Tukaj je koda za to:

javnih razred XYZZYCorporateLocationField : SPFieldText
{
javnih XYZZYCorporateLocationField
(SPFieldCollection polja, niz typeName, niz displayName)
: osnove(polja, typeName, displayName) { }

javnih XYZZYCorporateLocationField
(SPFieldCollection polja, niz displayName)
: osnove(polja, displayName) { }

javnih Preglasitev BaseFieldControl FieldRenderingControl
{
dobili
{
BaseFieldControl nadzor = nove XYZZYCorporateLocationFieldControl();
nadzor. Imepolja = to.InternalName;
vrnitev nadzor;
} //dobili
} // fieldrenderingcontrol

javnih Preglasitev niz GetValidatedString(predmet vrednost)
{
Če (to.Zahteva || vrednost. ToString().Je enako(Niz.Prazna))
{
vrzi nove SPFieldValidationException ("Oddelek ni dodeljena.");
}
vrnitev osnove.GetValidatedString(vrednost);
} // getvalidatedstring

} // XYZZYCorporateLocation

  1. Določite drug razred, ki deduje od osnovno polje kontrolnika, kot v:

javnih razred XYZZYCorporateLocationFieldControl : BaseFieldControl
{
zaščiteni DropDownList XYZZYCorporateLocationSelector;

zaščiteni Preglasitev niz DefaultTemplateName
{
dobili
{
vrnitev "XYZZYCorporateLocationFieldControl";
}
} // DefaultTemplateName

javnih Preglasitev predmet Vrednost
{
dobili
{
EnsureChildControls();
vrnitev to.SelectedValue XYZZYCorporateLocationSelector.;
} // dobili
Set
{
EnsureChildControls();
to.XYZZYCorporateLocationSelector.SelectedValue = (niz)to.ItemFieldValue;
} // Set
} // Preglasitev predmeta vrednost

zaščiteni Preglasitev nična CreateChildControls()
{

Če (to.Področju == NULL || to.ControlMode == SPControlMode.Prikaz)
vrnitev;

osnove.CreateChildControls();

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

Če (to.XYZZYCorporateLocationSelector == NULL)
vrzi nove Izjema("NAPAKA: Ni mogoče naložiti. Datoteki ASCX!");

Če (!to.IsPostBack strani.)
{

z uporabo (»SPSite « stran = nove »SPSite «("http://localhost/enterprisedata"))
{
z uporabo (SPWeb Spletna stran =. OpenWeb())
{

SPList.Update() currentList = spletni. Seznami["Podjetja lokacijah"];

foreach (SPItem XYZZYCorporateLocation v currentList.Items)
{
Če (XYZZYCorporateLocation["Naslov"] == NULL) «««;

niz theTitle;
theTitle = XYZZYCorporateLocation["Naslov"].ToString();

to.XYZZYCorporateLocationSelector.Items.Add
(nove ListItem(theTitle, theTitle));

} // foreach

} // z uporabo spweb web = site.openweb()
} // z uporabo strani »SPSite« = nov spsite("http://localhost/enterprisedata")

} // Če ne a povratno objavo

} // CreateChildControls

} // XYZZYCorporateLocationFieldControl

Zgornjo kodo v bistvu izvaja logika za populating DropDownList z vrednostmi iz seznama WSS po meri, ki se nahaja na http://localhost/enterprisedata in imenovan "oddelki podjetij".

I opredeljene obeh razredov v enotni .cs datoteko, skupljevati to ter ga v predpomnilniku GAC (močno potrebnih, seveda).

  1. Izvajanje predloga kontrolnika (.ascx) kot je prikazano:

<%@ Nadzor Jezik= "C#" Podeduje="Microsoft.SharePoint.portal.ServerAdmin.CreateSiteCollectionPanel1,Microsoft.SharePoint.portal,Prevod = 12.0.0.0, kultura = neutral,ŽetonJavnegaKljuča = 71e9bce111e9429c" compilationMode= "Vedno" %>
<%
@ Registracija TagPrefix= "wssawc" Namespace="Microsoft.SharePoint.WebControls" Skupščina="Microsoft.SharePoint, Različica = 12.0.0.0, Culture = neutral, ŽetonJavnegaKljuča = 71e9bce111e9429c" %> <%@ Registracija TagPrefix= "SharePoint" Namespace="Microsoft.SharePoint.WebControls" Skupščina="Microsoft.SharePoint, Različica = 12.0.0.0, Culture = neutral, ŽetonJavnegaKljuča = 71e9bce111e9429c" %>
<SharePoint:Predlogo upodabljanja ID= "XYZZYCorporateLocationFieldControl" potepuh= "strežnik">
<Predloga>
<ASP:DropDownList ID= "XYZZYCorporateLocationSelector" potepuh= "strežnik" />
</Predloga>
</
SharePoint:Predlogo upodabljanja>

Zgoraj je shranjena v c:\program filescommon filesmicrosoft sharedweb server extensions12controltemplates.

  1. Končno, Ustvarjamo XML datoteko shraniti v je... 12XML imenik. To je CAML, ki določa naše podatkovnim tipom po meri in za moj primer, izgleda takole:

<?XML različica="1.0" kodiranje="UTF-8" ?>
<
FieldTypes>
<
FieldType>
<
Polje ime="TypeName">CorporateLocations</Polje>
<
Polje ime="ParentType">Besedilo</Polje>
<
Polje ime="TypeDisplayName">Podjetja lokacijah</Polje>
<
Polje ime="TypeShortDescription">Povsod XYZZY podjetij, vključno z zmogljivostmi za proizvodnjo ali druge.</Polje>
<
Polje ime="UserCreatable">RES</Polje>
<
Polje ime="ShowInListCreate">RES</Polje>
<
Polje ime="ShowInDocumentLibraryCreate">RES</Polje>
<
Polje ime="ShowInSurveyCreate">RES</Polje>
<
Polje ime="ShowInColumnTemplateCreate">RES</Polje>
<
Polje ime="FieldTypeClass">Conchango.XYZZYCorporateLocationField, XYZZYCorporateLocationField, Različica = 1.0.0.0, Culture = neutral, ŽetonJavnegaKljuča = b0b19e85410990c4</Polje>
<
RenderPattern ime="DisplayPattern">
<
Stikalo>
<
Izraz>
<
Stolpec />
</
Izraz>

<Primeru Vrednost=""/>

<Privzeto>
<
HTML>
<![CDATA[
<span style = "barva:Red"><b>]]>
</
HTML>

<
Stolpec SubColumnNumber="0" HTMLEncode="RES"/>

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

</
Privzeto>
</
Stikalo>

</
RenderPattern>
</
FieldType>
</
FieldTypes>
Ta XML datoteka doda s podatkovnim tipom po meri WSS "knjižnica" in tekme gor v primerjavi z GAC je skupščina.

Po vseh teh bitov gibljejo na mesto, iisreset na strežniku in jo morajo vsi začeli delati lepo.

3 misli o "MOSS: Funkcionalno primer-podatkovnim tipom po meri

  1. Alejandro
    Zdravo Paul,
    predvsem, Hvala za članek, ker je zelo zanimiva. Samo eno vprašanje;
    Ali veste, če je možen onemogočijo pravilno vrsto polja po meri v pogledu podatkovnega lista za seznam?
    Ker vsako vrsto polja po meri, ustvariti to je prikazana samo za branje v pogledu podatkovnega lista (in MSDN, na primer, mi ne pomaga zelo veliko :-S).
    hvala
    Odgovor
  2. Albina

    Sem poskušala izvajati svojo rešitev. Vendar sem namesto DropDownList, Imam samo možnost za a DropDownChoiceList. Ali se zgodi, da vedo, kako prišteti reč v a DropDownChoiceList? Mi smo z uporabo SharePoint 2007 SP1 in Visual Studio 2005 SP1.

    Odgovor

pusti odgovor

Vaš e-naslov ne bo objavljen. Obvezna polja so označena *