Deploy di una colonna di sito di tipo lookup (SPFiledLookup)
Normalmente, in SharePoint 2010, per fare il deploy di una colonna di sito (SPField) è sufficiente creare una feature con scope site e nel file element.xml inserire questo codice:
Element.xml
In questo caso, trattandosi di un capo di tipo lookup (SPFieldLookup), bisognerebbe settare l'attributo List con il Guid della lista a cui il campo andrebbe collegato.
Il problema è che normalmente, in fase di progetto, non abbiamo il Giud della lista a cui vorremmo collegare il campo di lookup.
Per aggirare il problema si può aggiungere un evento sull'attivazione della feature (attributi ReceiverAssembly e ReceiverClass):
Feature.xml
e andare a settare la proprietà LookupList del campo SPFieldLookup nell'evento FeatureActivated:
Element.xml
XML
<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
<Field Type="Lookup" DisplayName="My Application" Required="TRUE"
ID="{6FC1C795-60F5-4705-ADFA-9A61B19C167B}" Name="Application"
List="" WebId="" ShowField="Area" />
</Elements>
Il problema è che normalmente, in fase di progetto, non abbiamo il Giud della lista a cui vorremmo collegare il campo di lookup.
Per aggirare il problema si può aggiungere un evento sull'attivazione della feature (attributi ReceiverAssembly e ReceiverClass):
Feature.xml
XML
<?xml version="1.0" encoding="utf-8"?>
<Feature xmlns="http://schemas.microsoft.com/sharepoint/" ActivateOnDefault="FALSE"
Description="Esempio di settin di un campo lookup"
Id="{248BC6F9-55F0-4204-B349-19CEF798C936}"
ReceiverAssembly="Sgart.Lookup, Version=1.0.0.0, Culture=neutral, PublicKeyToken=21d9d9d33ebd0d4f"
ReceiverClass="Sgart.Lookup.SetFieldFeatureEvent"
Scope="Site"
Title="Sgart lookup">
<ElementManifests>
<ElementManifest Location="elements.xml" />
</ElementManifests>
</Feature>
C#
namespace Sgart.Lookup
{
public class SetFieldFeatureEvent : Microsoft.SharePoint.SPFeatureReceiver
{
public override void FeatureActivated(Microsoft.SharePoint.SPFeatureReceiverProperties properties)
{
Manager.SetLookupFieldWithListId("DucatiApplication", "Lists/ApplicationArea");
}
public void SetLookupFieldWithListId(string fieldInternalName, string listRelativeUrl)
{
SPWeb web = SPContext.Current.Web;
bool prev = web.AllowUnsafeUpdates;
SPFieldLookup fld = (SPFieldLookup)web.Fields.GetFieldByInternalName(fieldInternalName);
if (fld.LookupList == "")
{
web.AllowUnsafeUpdates = true;
SPList list = web.GetList(web.ServerRelativeUrl.TrimEnd('/') + "/" + listRelativeUrl.TrimStart('/'));
fld.LookupList = list.ID.ToString();
fld.Update();
web.AllowUnsafeUpdates = prev;
}
}
}
}
Il codice funziona perchè la proprietà LookupList è stata lasciata blank nella definizione CAML (file element.xml). Infatti una volta impostata ogni successivo tentativo di modifica genera un eccezione.
La stessa cosa può essere fatta anche sulla proprietà WebIdSe la colonna lookup deve puntare a se stessa (la stessa lista in cui è applicato il campo lookup) si può usare la keyword Self (con la prima lettera maiuscola) nell'attributo List senza usare l'event handler
esempio:XML
<Field Type="LookupMulti" DisplayName="Related" Required="FALSE"
ID="{149C42F9-3B38-4B00-8BFB-42DB047883C6}" Name="RelReq"
EnforceUniqueValues="FALSE"
List="Self" ShowField="Title" Mult="TRUE" Sortable="FALSE"
UnlimitedLengthInDocumentLibrary="FALSE" />