MOSS: Funkcionalna Primjer - Custom Vrsta podataka

Poslovni Scenarij:

Enterprise-wide provedba Moss za proizvodne tvrtke s 30+ mjesta i nekoliko desetaka korporativni odjeli.

Poslovni cilj:

Unatoč mnoštvu poslovnih grupa (odjeli, mjesta, itd.), određene podatke treba održavati na globalnoj razini. Na primjer, autoritativni glavni popis svih fizičkih lokacija tvrtke (e.g. proizvodni pogoni, skladišnim mjestima, prodajnih ureda) treba održavati na središnjem mjestu.

Tehnički problem:

Poduzeće taksonomija je provedena pomoću više zbirki web-mjesta. Mi bismo voljeli stvarati autoritativni popis fizičkih lokacija u prilagođenom popisu WSS. Tada, kada smo trebali imati stupac u vrstu sadržaja (ili stupac dodali na popis ili biblioteku doc) koji je sadržavao korporativne mjestima, we would create a column using the "lookup" datatype i ukazuju na ovom glavnom popisu.

Nažalost, lookup datatypes must access a source list "locally" što znači da je naš autoritativni popis ne može obuhvatiti web zbirke.

Tehničko rješenje:

Provesti novu prilagođenu vrstu podataka odvijaju se na temelju SPField, a predstavljeni kao DropDownList u UI čiji ListItems popuniti s popisa master WSS.

Stvorili smo novu stranicu kolekciju pod nazivom "http://localhost/EnterpriseData". Tamo, we created a custom list named "Corporate Locations". This list just uses the standard "Title" Polje se nalazi i popis aktualnih korporativnih mjestima.

Jedan slijedi nekoliko diskretnih koraka za stvaranje prilagođeni vrstu podataka u WSS. Oni su:

  1. Definirajte klase koja nasljeđuje od SPField (jedan može naslijediti od drugih područja ako je potrebno).

Ovdje je broj za koji:

javni klasa XYZZYCorporateLocationField : SPFieldText
{
javni XYZZYCorporateLocationField
(SPFieldCollection Polja, niz typeName, niz displayName)
: baza(Polja, typeName, displayName) { }

javni XYZZYCorporateLocationField
(SPFieldCollection Polja, niz displayName)
: baza(Polja, displayName) { }

javni nadjačati BaseFieldControl FieldRenderingControl
{
dobiti
{
BaseFieldControl control = novi XYZZYCorporateLocationFieldControl();
control.FieldName = to.InternalName;
povratak control;
} //dobiti
} // fieldrenderingcontrol

javni nadjačati niz GetValidatedString(objekt vrijednost)
{
ako (to.Required || value.ToString().Jednako(Gudački.Prazan))
{
baciti novi SPFieldValidationException ("Department is not assigned.");
}
povratak baza.GetValidatedString(vrijednost);
} // getvalidatedstring

} // XYZZYCorporateLocation

  1. Odredite drugu klasu koja nasljeđuje iz baze kontrole na terenu, kao u:

javni klasa XYZZYCorporateLocationFieldControl : BaseFieldControl
{
zaštićen DropDownList XYZZYCorporateLocationSelector;

zaštićen nadjačati niz DefaultTemplateName
{
dobiti
{
povratak "XYZZYCorporateLocationFieldControl";
}
} // DefaultTemplateName

javni nadjačati objekt Vrijednost
{
dobiti
{
EnsureChildControls();
povratak to.XYZZYCorporateLocationSelector.SelectedValue;
} // dobiti
postaviti
{
EnsureChildControls();
to.XYZZYCorporateLocationSelector.SelectedValue = (niz)to.ItemFieldValue;
} // postaviti
} // override object Value

zaštićen nadjačati poništiti CreateChildControls()
{

ako (to.Field == nula || to.ControlMode == SPControlMode.Prikaz)
povratak;

baza.CreateChildControls();

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

ako (to.XYZZYCorporateLocationSelector == nula)
baciti novi Izuzetak("ERROR: Cannot load .ASCX file!");

ako (!to.Page.IsPostBack)
{

pomoću (SPSite site = novi SPSite("http://localhost / enterprisedata"))
{
pomoću (SPWeb web = site.OpenWeb())
{

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

foreach (SPItem XYZZYCorporateLocation u currentList.Items)
{
ako (XYZZYCorporateLocation["Title"] == nula) nastaviti;

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

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

} // foreach

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

} // if not a postback

} // CreateChildControls

} // XYZZYCorporateLocationFieldControl

Gore kod osnovi provodi logiku za naseljavanja DropDownList s vrijednostima iz WSS prilagođenom popisu se nalazi na http://localhost/enterprisedata and named "Corporate Departments".

Ja definirana obje klase u jednu datoteku. Cs, ga sastaviti i staviti ga u GAC (jaka required, naravno).

  1. Provesti predložak kontrole (.ascx) kao što je prikazano:

<%@ Kontrolirajte Jezik="C#" Nasljeđuje="Microsoft.SharePoint.Portal.ServerAdmin.CreateSiteCollectionPanel1,Microsoft.SharePoint.Portal,Inačica = 12.0.0.0, Culture = neutralan,PublicKeyToken = 71e9bce111e9429c" compilationMode="Always" %>
<%
@ Registar Tagprefix="wssawc" Prostor="Microsoft.SharePoint.WebControls" Montaža="Microsoft.SharePoint, Version=12.0.0.0, Kultura = neutralni, PublicKeyToken = 71e9bce111e9429c" %> <%@ Registar Tagprefix="SharePoint" Prostor="Microsoft.SharePoint.WebControls" Montaža="Microsoft.SharePoint, Version=12.0.0.0, Kultura = neutralni, PublicKeyToken = 71e9bce111e9429c" %>
<SharePoint:RenderingTemplate ID="XYZZYCorporateLocationFieldControl" runat="server">
<Predložak>
<trepetljika:DropDownList ID="XYZZYCorporateLocationSelector" runat="server" />
</Predložak>
</
SharePoint:RenderingTemplate>

Gore navedeni sprema u C:\Program Files Common Files Microsoft Shared web server ekstenzije 12 controltemplates.

  1. Konačno, možemo stvoriti XML datoteke za spremanje u ..... 12 XML imenik. Ovo je CAML koja definira naš običaj vrstu podataka i za moj primjer, izgleda ovako:

<?xml verzija="1.0" kodiranje="UTF-8" ?>
<
Fieldtypes>
<
FieldType>
<
Polje Ime="TypeName">CorporateLocations</Polje>
<
Polje Ime="ParentType">Tekst</Polje>
<
Polje Ime="TypeDisplayName">Corporate Locations</Polje>
<
Polje Ime="TypeShortDescription">All XYZZY Corporate locations including manufacturing or other facilities.</Polje>
<
Polje Ime="UserCreatable">TRUE</Polje>
<
Polje Ime="ShowInListCreate">TRUE</Polje>
<
Polje Ime="ShowInDocumentLibraryCreate">TRUE</Polje>
<
Polje Ime="ShowInSurveyCreate">TRUE</Polje>
<
Polje Ime="ShowInColumnTemplateCreate">TRUE</Polje>
<
Polje Ime="FieldTypeClass">Conchango.XYZZYCorporateLocationField, XYZZYCorporateLocationField, Verzija = 1.0.0.0, Kultura = neutralni, PublicKeyToken=b0b19e85410990c4</Polje>
<
RenderPattern Ime="DisplayPattern">
<
Prebaciti>
<
Expr>
<
Kolona />
</
Expr>

<Slučaj Vrijednost=""/>

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

<
Kolona SubColumnNumber="0" HTMLEncode="TRUE"/>

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

</
Default>
</
Prebaciti>

</
RenderPattern>
</
FieldType>
</
Fieldtypes>
This XML file adds the custom data type to the WSS "library" i utakmice se protiv GAC'd skupštine.

Nakon premještanja svih tih bitova u mjestu, iisreset na poslužitelju, a sve to treba početi raditi lijepo.

3 misli o „MOSS: Funkcionalna Primjer - Custom Vrsta podataka

  1. Alejandro
    Hi Pavao,
    Najprije, hvala na članak, jer to je jako zanimljivo. Samo jedno pitanje;
    Znate li da je car ispravno prikazati prilagođenu vrstu polja u prikazu podatkovne tablice iz popisa?
    Jer svaki običaj tip polja sam ga stvaraju se prikazati samo za čitanje u prikazu podatkovne (i MSDN, na primjer, ne pomaže mi jako puno :-S).
    Hvala
  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? Mi se koriste SharePoint 2007 SP1 i Visual Studio 2005 SP1.

Dopust jedan Odgovor

Vaša email adresa neće biti objavljena. obavezna polja su označena *