2009-09-22 10 views
8

Je dois ajouter une action de menu personnalisée à un type de contenu personnalisé par programmation dans C#. C'est parce que je ne connaîtrai pas l'URL à laquelle je dois faire un lien au préalable. L'URL à lier sera retirée de la configuration lorsque la fonctionnalité est activée. J'ai essayé ce qui suit:Comment ajouter des actions de menu personnalisées par programme dans SharePoint?

Ajouté le CustomAction dans mon fichier element.xml comme:

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

Dans mon récepteur fonction méthode FeatureActivated, je:

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); 
    } 
} 

je me attends à ce code pour mettre à jour UrlAction Url avec "MY URL" mais ce n'est pas le cas. Si je code dur une URL dans le XML cela fonctionne mais je dois être capable de le faire par programmation.

Répondre

2

En fonction de ce que vous voulez réaliser, vous pouvez utiliser du javascript;

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

le ~ ~ et le site sitecollection fonctionne aussi:

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

Il est dommage que la custom ECB ne supporte pas ControlClass, ce qui donnerait plus de flexibilité que les anciennes macros {SiteUrl}. – kbrimington

1

Je ne pense pas à la définition de schéma WSS permet un attribut URL vide dans l'élément UrlAction. Peut-être essayer de mettre une URL "par défaut" dans le fichier XML que vous écrasez plus tard?

7

Vous pouvez utiliser le SPUserCustomActionCollection sur l'objet 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(); 
     } 

De cette façon, vous pouvez définir l'URL à ce que vous voulez. Si vous mettez à jour une action personnalisée existante, vous pouvez parcourir la collection et mettre à jour celle que vous recherchez. La mise à jour de la définition XML de l'élément après l'installation de l'action personnalisée ne fait rien.

+0

Remarque: J'ai dû utiliser 'site.UserCustomActions.Add();', ou l'action n'était pas visible dans les sous-sites. – Kobi

Questions connexes