2009-09-22 14 views
8

È necessario aggiungere un'azione di menu personalizzata a un tipo di contenuto personalizzato a livello di programmazione in C#. Questo perché non saprò l'URL che ho bisogno di collegare in anticipo. L'URL per il collegamento verrà estratto dalla configurazione quando la funzione è attivata. Ho provato quanto segue:Come si aggiungono le azioni di menu personalizzate a livello di programmazione in SharePoint?

Aggiunta la CustomAction nel mio file Element.xml come:

<CustomAction 
     Id="MyID" 
     RegistrationType="ContentType" 
     RegistrationId="0x010100ef19b15f43e64355b39431399657766e" 
     Location="EditControlBlock" 
     Sequence="1000" 
     Title="My Menu Item"> 
    <UrlAction Url="" /> 
</CustomAction> 

Nel mio ricevitore caratteristica metodo FeatureActivated, ho:

SPElementDefinitionCollection eleCollection = 
    properties.Feature.Definition.GetElementDefinitions(
     new System.Globalization.CultureInfo(1)); 

foreach (SPElementDefinition ele in eleCollection) 
{ 
    if (ele.Id == "MyID") 
    { 
     System.Xml.XmlNode node = ele.XmlDefinition.FirstChild; 
     node.Attributes[0].Value = "MY URL"; 
     ele.FeatureDefinition.Update(true); 
    } 
} 

mi si aspetterebbe questo codice per aggiornare l'UrlAction Url con "MY URL" ma non lo fa. Se codifico un URL in XML funziona, ma devo essere in grado di farlo a livello di programmazione.

risposta

2

A seconda di ciò che si desidera ottenere, è possibile utilizzare alcuni javascript;

<UrlAction Url="JavaScript:window.location='{SiteUrl}/_layouts/CustomListAction.aspx?ID={ListId}'"/> 

il ~ ~ sito e sitecollection funziona anche:

<UrlAction Url="~site/_layouts/Page.aspx?ID={ListId}"/>
+0

È un peccato che l'abitudine ECB non supporti una ControlClass, che offre una maggiore flessibilità rispetto alle vecchie macro {SiteUrl}. – kbrimington

1

Non credo che la definizione dello schema WSS permette per un attributo Url vuota nell'elemento URLACTION. Forse prova a inserire un URL "predefinito" nell'xml che sovrascrivi più tardi?

7

È possibile utilizzare lo SPUserCustomActionCollection sull'oggetto SPWeb:

 using (SPSite site = new SPSite("http://moss.dev.com")) 
     using (SPWeb web = site.OpenWeb()) 
     { 
      SPContentType contentType = web.ContentTypes["Curriculum Vitae"]; 

      SPUserCustomAction action = web.UserCustomActions.Add(); 
      action.RegistrationType = SPUserCustomActionRegistrationType.ContentType; 
      action.RegistrationId = contentType.Id.ToString(); 
      action.Location = "EditControlBlock"; 
      action.Sequence = 450; 
      action.Title = "Test"; 
      action.Rights = SPBasePermissions.EditListItems; 
      action.Url = "http://www.google.com"; 

      action.Update(); 
     } 

In questo modo, è possibile impostare l'URL per quello che vuoi. Se si sta aggiornando un'azione personalizzata esistente, è possibile scorrere la raccolta e aggiornare quella che si sta cercando. Aggiornare la definizione XML dell'elemento dopo aver installato l'azione personalizzata non fa nulla.

+0

Nota: ho dovuto usare 'site.UserCustomActions.Add();', o l'azione non era visibile nei sottoreti. – Kobi

Problemi correlati