Kennen Sie folgendes Szenario? Sie entwickeln ein spezialisiertes Webpart. Das Webpart soll auf keiner anderen Seite bereitgestellt werden weil es nur auf dieser speziellen Seite zum Kontext passt. Natürlich soll es der Nutzer auch nicht auf die Seite setzen können.

Eine Möglichkeit wäre, dass Webpart soll eine Fehlermeldung ausgeben, wenn es sich auf der falschen Seite befindet. Die wesentlich elegantere Möglichkeit ist, dass es nicht in der Webpartgallerie aufgeführt ist. Nur wie schafft man das?

Ganz einfach! Stellen Sie Ihr Webpart wie bisher bereit, nur löschen Sie die .webpart-Datei. Nun kann das Webpart zwar programmatisch bereitgestellt werden, wird jedoch nicht angezeigt.

 

Achtung! Sollten Sie es schon einmal mit .webpart-Datei bereitgestellt haben dann ziehen Sie es einmal komplett zurück, löschen die Datei und stellen es wieder bereit.

2 Comments

  1. avatar

    Torsten Schuster

    Antworten

    dies geht noch etwas einfacher. dem site scoped feature wird ein eventreceiver hinzugefuegt, welcher beim deaktivieren des features das webpart file aus dem web part gallerie entfernt: public class FeatureEventReceiver : BaseFeatureReceiver { public override void FeatureDeactivating(SPSite site, SPFeatureReceiverProperties properties) { base.FeatureDeactivating(site, properties); RemoveFromGallery(site, properties); } public override void FeatureUninstalling(SPSite site, SPFeatureReceiverProperties properties) { base.FeatureUninstalling(site, properties); RemoveFromGallery(site, properties); } private static void RemoveFromGallery(SPSite site, SPFeatureReceiverProperties properties) { var elements = properties.Definition.GetElementDefinitions(CultureInfo.CurrentCulture); var webparts = elements.Cast() .SelectMany(e => e.XmlDefinition.ChildNodes.Cast() .Where(n => n.Name.Equals(„File“)) .Select(n => n.Attributes[„Url“].Value) ) .ToList(); var wpGallery = site.RootWeb.GetCatalog(SPListTemplateType.WebPartCatalog); var galleryItems = wpGallery.Items.Cast() .Where(li => webparts.Contains(li.File.Name)) .ToList(); for (int i = galleryItems.Count – 1; i >= 0; i–) { var item = galleryItems[i]; item.Delete(); } } } /// /// Base class that makes the feature scope available as an argument to the /// FeatureActivated and FeatureDeactivating methods /// /// /// T is the class type of the scope of the feature (SPFarm, SPWebApplication, SPSite, or SPWeb) /// public abstract class BaseFeatureReceiver : SPFeatureReceiver { [SharePointPermission(SecurityAction.LinkDemand, ObjectModel = true)] public sealed override void FeatureActivated(SPFeatureReceiverProperties properties) { FeatureActivated((T)properties.Feature.Parent, properties); } [SharePointPermission(SecurityAction.LinkDemand, ObjectModel = true)] public virtual void FeatureActivated(T scope, SPFeatureReceiverProperties properties) { } [SharePointPermission(SecurityAction.LinkDemand, ObjectModel = true)] public sealed override void FeatureDeactivating(SPFeatureReceiverProperties properties) { FeatureDeactivating((T)properties.Feature.Parent, properties); } [SharePointPermission(SecurityAction.LinkDemand, ObjectModel = true)] public virtual void FeatureDeactivating(T scope, SPFeatureReceiverProperties properties) { } [SharePointPermission(SecurityAction.LinkDemand, ObjectModel = true)] public override void FeatureInstalled(SPFeatureReceiverProperties properties) { FeatureInstalled((T)properties.Feature.Parent, properties); } [SharePointPermission(SecurityAction.LinkDemand, ObjectModel = true)] public virtual void FeatureInstalled(T scope, SPFeatureReceiverProperties properties) { } [SharePointPermission(SecurityAction.LinkDemand, ObjectModel = true)] public override void FeatureUninstalling(SPFeatureReceiverProperties properties) { FeatureUninstalling((T)properties.Feature.Parent, properties); } [SharePointPermission(SecurityAction.LinkDemand, ObjectModel = true)] public virtual void FeatureUninstalling(T scope, SPFeatureReceiverProperties properties) { } }

  2. avatar

    Steffen Schindler

    Antworten

    Welche Lösung die einfachere ist, muss wohl jeder selbst entscheiden. Jedoch möchte ich noch auf ein Unstimmigkeit hinweisen. Das Ziel war, dass Webpart aus der entsprechenden Gallerie zu entfernen. Entsprechend muss man dem Code im Event FeatureActivating oder FeatureActivated ausführen.

Leave a comment

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Time limit is exhausted. Please reload the CAPTCHA.