Moss: Exemplo Funcional - tipo de datos personalizado

Escenario empresarial:

En toda a empresa a implantación de Moss para empresa de construción con 30+ sitios e unha ducia de departamentos corporativos.

Negocios Obxectivo:

A pesar de un gran número de grupos empresariais (departamentos, locais, etc), certos datos debe ser mantida a un nivel mundial. Por exemplo, unha lista mestra autorizada de todos os lugares físicos da empresa (e.g. instalacións de produción, localizacións de almacén, oficinas de vendas) a manter nun lugar central.

Problema Técnico:

A taxonomía empresa implementado empregando varios conxuntos de sitios. Teriamos gusto de crear a lista oficial de lugares físicos nunha lista personalizada WSS. Entón, cando necesitamos ter unha columna nun tipo de contidos (ou unha columna engadida a unha lista ou biblioteca doc) que as empresas locais contidos, we would create a column using the "lookup" tipo de datos e apuntar a esta lista mestra.

Desafortunadamente, lookup datatypes must access a source list "locally" o que significa que a nosa lista oficial non pode abranguer conxuntos de sitios.

Solución Técnica:

Aplicar un novo tipo de datos personalizado aplicado na base SPField e representado como un DropDownList no UI cuxo ListItems cubrir a partir da lista WSS mestre.

Creamos unha nova colección sitio chamado "http://localhost/EnterpriseData". Alí, we created a custom list named "Corporate Locations". This list just uses the standard "Title" campo para conter a lista de lugares corporativos reais.

Un segue varias etapas distintas para crear un tipo de datos personalizado na WSS. Son:

  1. Definir unha clase que herda de SPField (alguén pode herdar doutros campos, se é necesario).

Aquí está o código para que:

público clase XYZZYCorporateLocationField : SPFieldText
{
público XYZZYCorporateLocationField
(SPFieldCollection campos, corda typeName, corda displayName)
: base(campos, typeName, displayName) { }

público XYZZYCorporateLocationField
(SPFieldCollection campos, corda displayName)
: base(campos, displayName) { }

público substituír BaseFieldControl FieldRenderingControl
{
obter
{
BaseFieldControl control = novo XYZZYCorporateLocationFieldControl();
control.FieldName = este.InternalName;
volver control;
} //obter
} // fieldrenderingcontrol

público substituír corda GetValidatedString(obxecto valor)
{
se (este.Required || value.ToString().Igual(Corda.Baleiro))
{
xogar novo SPFieldValidationException ("Department is not assigned.");
}
volver base.GetValidatedString(valor);
} // getvalidatedstring

} // XYZZYCorporateLocation

  1. Establecer outra clase que herda o control de campo de base, como no:

público clase XYZZYCorporateLocationFieldControl : BaseFieldControl
{
protexido DropDownList XYZZYCorporateLocationSelector;

protexido substituír corda DefaultTemplateName
{
obter
{
volver "XYZZYCorporateLocationFieldControl";
}
} // DefaultTemplateName

público substituír obxecto Valor
{
obter
{
EnsureChildControls();
volver este.XYZZYCorporateLocationSelector.SelectedValue;
} // obter
conxunto
{
EnsureChildControls();
este.XYZZYCorporateLocationSelector.SelectedValue = (corda)este.ItemFieldValue;
} // conxunto
} // override object Value

protexido substituír invalidar CreateChildControls()
{

se (este.Field == nulo || este.ControlMode == SPControlMode.Ver)
volver;

base.CreateChildControls();

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

se (este.XYZZYCorporateLocationSelector == nulo)
xogar novo Excepción("ERROR: Cannot load .ASCX file!");

se (!este.Page.IsPostBack)
{

utilización (SPSite site = novo SPSite("Http://localhost / enterprisedata"))
{
utilización (SPWeb web = site.OpenWeb())
{

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

foreach (SPItem XYZZYCorporateLocation en currentList.Items)
{
se (XYZZYCorporateLocation["Title"] == nulo) continuar;

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

este.XYZZYCorporateLocationSelector.Items.Add
(novo Listitem(thetitle, thetitle));

} // foreach

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

} // if not a postback

} // CreateChildControls

} // XYZZYCorporateLocationFieldControl

O código anterior, basicamente aplica a lóxica para cubrir o DropDownList cos valores da lista personalizada WSS situado na http://localhost/enterprisedata and named "Corporate Departments".

Eu define ambas clases nun arquivo de cs único., compilado-lo e colocar-lo no GAC (forte necesaria, claro).

  1. Implementar un modelo de control (.ascx) como se mostra:

<%@ Control Linguaxe="C#" Herda="Microsoft.SharePoint.Portal.ServerAdmin.CreateSiteCollectionPanel1,Microsoft.SharePoint.Portal,Version = 12.0.0.0, Culture = neutral,PublicKeyToken = 71e9bce111e9429c" compilationMode="Always" %>
<%
@ Rexistrarse Tagprefix="wssawc" Namespace="Microsoft.SharePoint.WebControls" Montaxe="Microsoft.SharePoint, Version = 12.0.0.0, Culture = neutral, PublicKeyToken = 71e9bce111e9429c" %> <%@ Rexistrarse Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Montaxe="Microsoft.SharePoint, Version = 12.0.0.0, Culture = neutral, PublicKeyToken = 71e9bce111e9429c" %>
<SharePoint:RenderingTemplate ID="XYZZYCorporateLocationFieldControl" runat="server">
<Modelo>
<áspide:DropDownList ID="XYZZYCorporateLocationSelector" runat="server" />
</Modelo>
</
SharePoint:RenderingTemplate>

A descrición anterior é gardado en c:\Arquivos de programas Arquivos comúns Microsoft Shared Web Server Extensions 12 CONTROLTEMPLATES.

  1. Finalmente, creamos un arquivo XML para gardar no ..... 12 directorio XML. Este é CAML que define o noso tipo de datos personalizado e para o meu exemplo, Parece que este:

<?xml versión="1.0" codificación="utf-8" ?>
<
FieldTypes>
<
FieldType>
<
Campo Nome="TypeName">CorporateLocations</Campo>
<
Campo Nome="ParentType">Texto</Campo>
<
Campo Nome="TypeDisplayName">Corporate Locations</Campo>
<
Campo Nome="TypeShortDescription">All XYZZY Corporate locations including manufacturing or other facilities.</Campo>
<
Campo Nome="UserCreatable">TRUE</Campo>
<
Campo Nome="ShowInListCreate">TRUE</Campo>
<
Campo Nome="ShowInDocumentLibraryCreate">TRUE</Campo>
<
Campo Nome="ShowInSurveyCreate">TRUE</Campo>
<
Campo Nome="ShowInColumnTemplateCreate">TRUE</Campo>
<
Campo Nome="FieldTypeClass">Conchango.XYZZYCorporateLocationField, XYZZYCorporateLocationField, Version = 1.0.0.0, Culture = neutral, PublicKeyToken=b0b19e85410990c4</Campo>
<
RenderPattern Nome="DisplayPattern">
<
Cambiar>
<
Expr>
<
Columna />
</
Expr>

<No caso de Valor=""/>

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

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

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

</
Omisión>
</
Cambiar>

</
RenderPattern>
</
FieldType>
</
FieldTypes>
This XML file adds the custom data type to the WSS "library" e compara-se contra o conxunto GAC'd.

Despois de se cambiar todos eses bits no seu lugar, iisreset no servidor e todo debe comezar a traballar moi ben.

3 pensamentos sobre "Moss: Exemplo Funcional - tipo de datos personalizado

  1. Alejandro
    Ola Paulo,
    En primeiro lugar, grazas polo artigo, porque é moi interesante. Só unha pregunta;
    Vostede sabe se é posible para procesar correctamente un tipo de campo personalizado en modo folla de datos dunha lista?
    Como cada tipo de campo personalizado que crear é como só lectura en modo Folla de Datos (eo MSDN, por exemplo, non me axuda moito :-S).
    Grazas
    Responder
  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? Estamos a usar SharePoint 2007 SP1 e Visual Studio 2005 SP1.

    Responder

Deixe unha resposta

Enderezo de correo electrónico non será publicado. Os campos obrigatorios están marcados *