MOSS: Exemple funcional-dades personalitzades tipus

Escenari de negocis:

Implantació àmplia d'empresa de molsa per empresa de fabricació amb 30+ uns quants dotzena corporatives departaments i llocs.

Objectiu de negoci:

Malgrat la multitud de grups empresarials (departaments, localitzacions, etc), ha de mantenir certes dades a nivell global. Per exemple, una llista mestra autoritzat de totes les ubicacions físiques de l'empresa (e. g. instal·lacions de fabricació, localitzacions de magatzem, oficines de vendes) ha de mantenir en un emplaçament cèntric.

Problema tècnic:

La taxonomia d'empresa va ser implementat utilitzant múltiples col·leccions de llocs. Ens hagués agradat crear una llista personalitzada WSS llista d'ubicacions físiques. Llavors, Quan el necessitàvem tenir una columna en un tipus de contingut (o una columna s'afegeix a una llista o document de la biblioteca) que contenia llocs corporatius, hem de crear una columna mitjançant la cerca"" tipus de dades i punt d'aquesta llista mestra.

Per desgràcia, es cerca d'accedir a una llista de font "localment" és a dir que la nostra llista autoritzat no pot abastar col·leccions de llocs.

Solució tècnica:

Implementar un nou tipus de dades personalitzades implementat sobre la base d'SPField i representat com un DropDownList en l'UI poblar la ListItems de la llista mestra WSS.

Hem creat una nova col·lecció anomenada "http://localhost/EnterpriseData". Hi ha, hem creat una llista personalitzada anomenat "Localitzacions corporativa". Aquesta llista només utilitza el "títol estàndard" camp conté la llista d'ubicacions reals corporatius.

Seguint uns quants passos discrets per crear un tipus de dades personalitzades en WSS. Són:

  1. Definir una classe que hereti des d'SPField (un pot heretar d'altres camps, si és necessari).

Aquí està el codi per a que:

públic classe XYZZYCorporateLocationField : SPFieldText
{
públic XYZZYCorporateLocationField
(SPFieldCollection camps, corda typeName, corda displayName)
: base(camps, typeName, displayName) { }

públic XYZZYCorporateLocationField
(SPFieldCollection camps, corda displayName)
: base(camps, displayName) { }

públic invalidació BaseFieldControl FieldRenderingControl
{
aconseguir
{
BaseFieldControl control = nou XYZZYCorporateLocationFieldControl();
control. FieldName = això.InternalName;
retorn control;
} //aconseguir
} // fieldrenderingcontrol

públic invalidació corda GetValidatedString(objecte valor)
{
Si (això.Requerit || valor. ToString().És igual a(Corda.Buit))
{
tir nou SPFieldValidationException ("Departament no està assignat.");
}
retorn base.GetValidatedString(valor);
} // getvalidatedstring

} // XYZZYCorporateLocation

  1. Definir una altra classe que hereta el control de camp base, com a:

públic classe XYZZYCorporateLocationFieldControl : BaseFieldControl
{
protegit DropDownList XYZZYCorporateLocationSelector;

protegit invalidació corda DefaultTemplateName
{
aconseguir
{
retorn "XYZZYCorporateLocationFieldControl";
}
} // DefaultTemplateName

públic invalidació objecte Valor
{
aconseguir
{
EnsureChildControls();
retorn això.XYZZYCorporateLocationSelector.SelectedValue;
} // aconseguir
conjunt
{
EnsureChildControls();
això.XYZZYCorporateLocationSelector.SelectedValue = (corda)això.ItemFieldValue;
} // conjunt
} // substituir el valor d'objecte

protegit invalidació buit CreateChildControls()
{

Si (això.Camp = = nul·la || això.ControlMode = = SPControlMode.Exhibició)
retorn;

base.CreateChildControls();

això.XYZZYCorporateLocationSelector =
(DropDownList)FindControl TemplateContainer.("XYZZYCorporateLocationSelector");

Si (això.XYZZYCorporateLocationSelector = = nul·la)
tir nou Excepció("ERROR: No es pot carregar. Fitxer ASCX!");

Si (!això.Pàgina de IsPostBack.)
{

utilitzant (SPSite lloc = nou SPSite("http://localhost/enterprisedata"))
{
utilitzant (SPWeb web = lloc. OpenWeb())
{

SPList currentList = la web. Llistes["Llocs corporatius"];

foreach (SPItem XYZZYCorporateLocation en currentList.Items)
{
Si (XYZZYCorporateLocation[Títol""] == nul·la) «««;

corda theTitle;
theTitle = XYZZYCorporateLocation[Títol""].ToString();

això.XYZZYCorporateLocationSelector.Items.Add
(nou Element de llista(theTitle, theTitle));

} // foreach

} // utilitzant spweb web = site.openweb()
} // utilitzant spsite lloc = spsite nou("http://localhost/enterprisedata")

} // Si no una devolució

} // CreateChildControls

} // XYZZYCorporateLocationFieldControl

El codi citat bàsicament implementa la lògica per emplenar el DropDownList amb els valors de la llista de costum WSS situat al http://localhost/enterprisedata i anomenat "departaments corporativa".

Defineix ambdues classes en un arxiu sol CS, compilat i posar-lo a la GAC (fort requerit, clar).

  1. Aplicar una plantilla de control (.ascx) com es Mostra:

<%@ Control Llengua= "C#" Hereta="Microsoft.SharePoint.Portal.ServerAdmin.CreateSiteCollectionPanel1,Microsoft.SharePoint.Portal,Versió = 12.0.0.0, cultura = neutre,PublicKeyToken = 71e9bce111e9429c" compilationMode= "Sempre" %>
<%
@ Registrar-se TagPrefix= «wssawc" Espai de noms="Microsoft.SharePoint.WebControls" L'Assemblea="Microsoft.SharePoint, Versió = 12.0.0.0, Cultura = neutral, PublicKeyToken = 71e9bce111e9429c" %> <%@ Registrar-se TagPrefix= "Del SharePoint" Espai de noms="Microsoft.SharePoint.WebControls" L'Assemblea="Microsoft.SharePoint, Versió = 12.0.0.0, Cultura = neutral, PublicKeyToken = 71e9bce111e9429c" %>
<SharePoint:Plantilla de representació ID= «XYZZYCorporateLocationFieldControl" runat= "servidor">
<Plantilla>
<escurçó:DropDownList ID= «XYZZYCorporateLocationSelector" runat= "servidor" />
</Plantilla>
</
SharePoint:Plantilla de representació>

L'anterior està guardada en c:\programa filescommon comunesMicrosoft sharedweb server extensions12controltemplates.

  1. Finalment, Creem un fitxer XML a salvar a la... 12XML directori. Això és CAML que defineix el nostre tipus de dades personalitzades i pel meu exemple, aquest aspecte:

<?XML versió="1.0" codificació="UTF-8" ?>
<
FieldTypes>
<
FieldType>
<
Camp Nom="TypeName">CorporateLocations</Camp>
<
Camp Nom="ParentType">Text</Camp>
<
Camp Nom="TypeDisplayName">Llocs corporatius</Camp>
<
Camp Nom="TypeShortDescription">Totes les localitzacions XYZZY corporativa incloent instal·lacions de fabricació o altres.</Camp>
<
Camp Nom="UserCreatable">VERITABLE</Camp>
<
Camp Nom="ShowInListCreate">VERITABLE</Camp>
<
Camp Nom="ShowInDocumentLibraryCreate">VERITABLE</Camp>
<
Camp Nom="ShowInSurveyCreate">VERITABLE</Camp>
<
Camp Nom="ShowInColumnTemplateCreate">VERITABLE</Camp>
<
Camp Nom="FieldTypeClass">Conchango.XYZZYCorporateLocationField, XYZZYCorporateLocationField, Versió 1.0.0.0 de =, Cultura = neutral, PublicKeyToken = b0b19e85410990c4</Camp>
<
RenderPattern Nom="DisplayPattern">
<
Interruptor>
<
EXPR>
<
Columna />
</
EXPR>

<Cas Valor=""/>

<Per defecte>
<
HTML>
<![CDATA[
<abasten estil = "color:Vermell"><b>]]>
</
HTML>

<
Columna SubColumnNumber="0" HTMLEncode="VERITABLE"/>

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

</
Per defecte>
</
Interruptor>

</
RenderPattern>
</
FieldType>
</
FieldTypes>
Aquest fitxer XML afegeix el tipus de dades personalitzades a la "biblioteca WSS" i fa correspondre'l en contra de la GAC havia Assemblea.

Després entrant tots aquests bits en lloc, iisreset en el servidor i ho hauria all stars treballant de manera bonica.

3 comentaris a "MOSS: Exemple funcional-dades personalitzades tipus

  1. Alejandro
    Hola Pau,
    Primer de tot, Gràcies per l'article, perquè és molt interessant. Només una pregunta;
    Sap vostè si és posible per representar correctament un tipus de camp personalitzat a la visualització de full de dades d'una llista?
    Perquè cada tipus de camp personalitzat creo és mostrat com només de lectura a vista full de dades (i el MSDN, per exemple, no m'ajudi molt :-S).
    Gràcies
    Resposta
  2. Francesc

    Estic tractant d'implementar la solució. No obstant això jo en lloc de DropDownList, Només tinc l'opció per un DropDownChoiceList. Passar a saber com afegir elements a una DropDownChoiceList? Estem utilitzant SharePoint 2007 SP1 i Visual Studio 2005 SP1.

    Resposta

Deixi una contestació

no es publicarà la seva adreça de correu electrònic. Els camps necessaris estan marcats *