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

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>
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

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>

e andare a settare la proprietà LookupList del campo SPFieldLookup nell'evento FeatureActivated:

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à WebId
Se 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"  />
Tags:
SharePoint497 SharePoint 2010224
Potrebbe interessarti anche: