none
CustomAction: Ne fonctionne pas en utilisant ControlAssembly/ControlClass RRS feed

  • Question

  • Bonjour,
    Afin d'ajouter un bouton au menu new d'une liste spécifique, j'ai utilisé une Custom Action avec ControlClass and the ControlAssembly mais le bouton ne s'affiche pas. Si au lieu de ces attribut j'utilise  <UrlAction ... />, le bouton apparaît bien mais sur toutes mes listes. J'utilise STSDEV pr developper. Je me suis aussi aidé de ce site : http://www.nearinfinity.com/blogs/joe_ferner/how_to_add_a_custom_action_to.html

    Voici mon fichier SolutionConfig.xml :
    <?xml version="1.0" encoding="utf-8"?>
    
    <!--Created by STSDEV at 08/07/2009 16:35:18-->
    
    <Solution>
    
      <SolutionId>1FB0D599-7D85-4515-A167-3ED97CD842CC</SolutionId>
    
      <SolutionName>CustomActionControlClass</SolutionName>
    
      <ResetWebServer>True</ResetWebServer>
    
      <AssemblyDeployment>True</AssemblyDeployment>
    
      <SafeControlSettings>False</SafeControlSettings>
    
      <CasPermissions>False</CasPermissions>
    
      <!--Assembly files-->
    
      <Assemblies>
    
        <Assembly Location="CustomActionControlClass.dll" DeploymentTarget="GlobalAssemblyCache">
    
          <SafeControls>
    
            <SafeControl Assembly="CustomActionControlClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abf59b3ca9443f64" Namespace="CustomActionControlClass" TypeName="*" Safe="True" />
    
          </SafeControls>
    
        </Assembly>
    
      </Assemblies>
    
    </Solution>
    
    


    Voici mon fichier manifest.xml :
    <?xml version="1.0" encoding="utf-8"?>
    
    <!--Manifest created STSDEV utility at 09/07/2009 12:13:06-->
    
    <Solution SolutionId="1FB0D599-7D85-4515-A167-3ED97CD842CC" ResetWebServer="True" xmlns="http://schemas.microsoft.com/sharepoint/">
    
      <!--Feature Manifest files-->
    
      <FeatureManifests>
    
        <FeatureManifest Location="CustomActionControlClass\feature.xml" />
    
      </FeatureManifests>
    
      <!--TEMPLATE files-->
    
      <TemplateFiles>
    
        <TemplateFile Location="IMAGES\CustomActionControlClass\AfricanPith32.gif" />
    
      </TemplateFiles>
    
      <!--Assembly files-->
    
      <Assemblies>
    
        <Assembly Location="CustomActionControlClass.dll" DeploymentTarget="GlobalAssemblyCache" />
    
      </Assemblies>
    
    </Solution>
    
    


    Voici mon fichier feature.xml :
    <?xml version="1.0" encoding="utf-8"?>
    
    <!--Created by STSDEV at 08/07/2009 16:35:18-->
    
    <Feature
    
      Id="A3E2F3EE-1637-43C8-ACCB-CE273E96AEE7"
    
      Title="A sample feature: CustomActionControlClass"
    
      Description="This SharePoint solution was created by the STSDEV utility (http://codeplex.com/stsdev)"
    
      Version="1.0.0.0"
    
      Scope="Site"
    
      Hidden="false"
    
      ImageUrl="CustomActionControlClass\AfricanPith32.gif"
    
      ReceiverAssembly="CustomActionControlClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abf59b3ca9443f64"
    
      ReceiverClass="CustomActionControlClass.FeatureReceiver" xmlns="http://schemas.microsoft.com/sharepoint/">
    
      <ElementManifests>
    
        <ElementManifest
    
          Location="elements.xml" />
    
      </ElementManifests>
    
    </Feature>
    
    


    Voici mon fichier elements.xml :
    <?xml version="1.0" encoding="utf-8"?>
    
    <!--Created by STSDEV at 08/07/2009 16:35:18-->
    
    <Elements xmlns="http://schemas.microsoft.com/sharepoint/">
    
      <CustomAction
    
        Id="MyCustomAction"
    
        RegistrationType="List"
    
        GroupId="NewMenu"
    
        Location="Microsoft.SharePoint.StandardMenu"
    
        Sequence="1000"
    
        ControlAssembly="CustomActionControlClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abf59b3ca9443f64"
    
        ControlClass="CustomActionControlClass.MyCustomAction"
    
      >
    
      </CustomAction>
    
    
    
    </Elements>
    
    


    Et enfin voici mon fichier MyCustomAction.cs :
    using System;
    
    using System.Collections.Generic;
    
    using System.Text;
    
    using System.Web.UI.WebControls;
    
    using Microsoft.SharePoint.WebControls;
    
    using Microsoft.SharePoint;
    
    
    
    namespace CustomActionControlClass
    
    {
    
        public class MyCustomAction : WebControl
    
        {
    
            private MenuItemTemplate _action;
    
    
    
            protected override void CreateChildControls()
    
            {
    
                SPWeb site = SPContext.Current.Web;
    
    
    
                _action = new MenuItemTemplate
    
                {
    
                    Text = "My Action",
    
                    Description = "My Action",
    
                    ImageUrl = "/_layouts/images/NEWITEM.GIF",
    
                    ClientOnClickNavigateUrl = "http://www.microsoft.com"
    
                };
    
    
    
                this.Page.Controls.Add(_action);
    
                base.CreateChildControls();
    
    
    
            }
    
        }
    
    }
    
    
    
    


    Merci de votre aide !
    vendredi 10 juillet 2009 05:56

Réponses

  • Le log de SharePoint indique peut être quelquechose au moment ou vous affichez une page où le contrôle est sensé apparaitre, pourriez-vous y jeter un coup d'oeil ?
    http://blogs.developpeur.org/anouvel
    • Marqué comme réponse BougRun mercredi 15 juillet 2009 07:03
    vendredi 10 juillet 2009 16:10
  • J'ai regardé les logs de Sharepoint et j'ai trouvé un erreure qui m'était passé sous le nez :


    Failed to create a control from assembly 'CustomActionControlClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abf59b3ca9443f64', class 'CustomActionControlClass.MyCustomAction': Le contrôle associé au nom d'assembly « CustomActionControlClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abf59b3ca9443f64 » et au nom de classe « CustomActionControlClass.MyCustomAction » n'est pas autorisé pour le site Web à l'URL « http://moss-dev ». Le type n'est pas inscrit comme fiable.

    J'ai alors vérifié mon fichier SolutionConfig.xml, j'avais bien les balises SafeControl dans Assemblies ms SafeControlSettings était à False


    <SafeControlSettings>True</SafeControlSettings>

    Une fois que j'ai relancé le déploiment de ma solution j'ai rencontré une erreur de déploiement :


    Cette solution contient des ressources dont l'étendue se situe au niveau d'une application Web et doit être déployée sur une ou plusieurs applications Web.
    

    Je suis alors tombé sur ton post . J'ai donc rajouté -allcontenturls dans ma commande du fichier targets généré par STSDEV :


    <Exec Command="$(STSADM) -o deploysolution -name $(PackageName) -immediate -allowgacdeployment -allcontenturls -force" />

    Puis j'ai fermé et réouvert ma solution ds VS pr qu'il prenne en compte ces modification. J'ai relancé le déploiement et là ca marche mieux !

    Merci de ton aide
    • Marqué comme réponse BougRun mercredi 15 juillet 2009 07:03
    • Modifié BougRun mercredi 15 juillet 2009 10:01
    mercredi 15 juillet 2009 07:00

Toutes les réponses

  • Bonjour,

    je pense que c'est le this.Page.Controls.Add(_action) qui coince.

    Il faudrait mettre this.Controls.Add(_action) à la place.

    Est-ce que cela résoud votre problème ?
    http://blogs.developpeur.org/anouvel
    • Proposé comme réponse Arnault Nouvel vendredi 10 juillet 2009 07:21
    • Non proposé comme réponse BougRun vendredi 10 juillet 2009 12:16
    vendredi 10 juillet 2009 07:21
  • Merci de votre aide, mais malheureusement cela ne résous pas mon problème. Est-ce qu'il serait possible de voir si au moins la méthode CreateChildControls est exécutée, par exemple par un affichage console ou autre, si oui comment faire ?

    Merci
    vendredi 10 juillet 2009 07:49
  • Oui, il y a 2 moyen simples de le faire :
    - en debuggant - avec Visual Studio attachez vous à tous les processus w3wp.exe puis mettez un point d'arret dans votre méthode, et naviguez sur la page en question. Vous devriez alors pouvoir passer en pas a pas
    - en ajoutant un message d'alerte - dans votre méthode, ajoutez cette ligne de code :

    this.Page.Response.Write("<script>alert('test')</script>");
    

    http://blogs.developpeur.org/anouvel
    • Proposé comme réponse Arnault Nouvel vendredi 10 juillet 2009 09:03
    vendredi 10 juillet 2009 09:03
  • J'ai testé les deux méthodes et il semblerait bien que la méthode CreateChildControls() n'est pas appelée.  Pourtant les lignes qui l'appelle semblent être correcte :
    ControlAssembly="CustomActionControlClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abf59b3ca9443f64"
    ControlClass="CustomActionControlClass.MyCustomAction"
    
    Qu'est ce qui pourrait causer cela d'après vous ?
    Merci.
    vendredi 10 juillet 2009 12:20
  • A mon sens il y a trois raisons possible :
    - Le tout est mal déployé
    - l'XML de CustomAction est mal écrit
    - Le ControlAssembly/ControlClass est mal écrit

    Il faut savoir dans quel cas on se trouve, en procédant par élimination

    1. Déploiement
    A chaque fois que vous mettez à jour l'assembly dans le GAC, pensez à faire un IISRESET
    Forcez une réinstallation de la feature : stsadm -o installfeature -name ma_feature -force
    Vérifiez que votre feature est activée sur le scope cible

    2. vérifier le XML de CustomAction
    Duppliquez votre élément <CustomAction> en supprimant ControlAssembly/ControlClass et en ajoutant un lien à la place (renseignez la propriété Title et ajoutez un sous élément de type <UrlAction Url="/layouts/viewlsts.aspx" />
    Si vous voyez le lien apparaitre à l'endroit prévu, à priori l'XML est bon.

    3. ControlAssembly/Control class mal écrit
    Utilisez Reflector pour récupérer les 2 valeurs

    http://blogs.developpeur.org/anouvel
    • Proposé comme réponse Arnault Nouvel vendredi 10 juillet 2009 13:00
    vendredi 10 juillet 2009 12:59
  • J'ai suivi ce que vous m'avez conseillé :

    3 : J'ai récupéré à partir de la dll du projet généré ds le dossier BIN avec .NET Reflector :
    Name: CustomActionControlClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abf59b3ca9443f64
    Name: CustomActionControlClass.MyCustomAction

    Ce que j'ai entré ds mon fichier XML :
    ControlAssembly="CustomActionControlClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abf59b3ca9443f64"
    ControlClass="CustomActionControlClass.MyCustomAction"

    2 : J'ai rajouté un CustomAction :
    <?xml version="1.0" encoding="utf-8"?>
    <!--Created by STSDEV at 08/07/2009 16:35:18-->
    <Elements xmlns="http://schemas.microsoft.com/sharepoint/">
      <CustomAction
        Id="MyCustomAction"
        RegistrationType="List"
        RegistrationId="101"
        Sequence="1000"
        GroupId="NewMenu"
        Location="Microsoft.SharePoint.StandardMenu"
        Title="CustomAction"
        ControlAssembly="CustomActionControlClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abf59b3ca9443f64"
        ControlClass="CustomActionControlClass.MyCustomAction"
      >
      </CustomAction>
      <CustomAction
       Id="MyCustomAction"
       RegistrationType="List"
       RegistrationId="101"
       Sequence="1001"
       GroupId="NewMenu"
       Location="Microsoft.SharePoint.StandardMenu"
       Title="Url"
      >
        <UrlAction Url="~sitecollection/Lists/Entreprise/NewForm.aspx" />
      </CustomAction>
    
    </Elements>
    Le lien URL est bien apparu ds le NewMenu

    1 : J'ai fait une réinstall de la feature suivi d'un IISRESET, rien n'a changé.

    J'ai vérifié ds la GAC la DLL de ma feature pour voir si elle était à jour : C:\windows\assembly\GAC_MSIL\CustomActionControlClass\
    Elle est bien à jour.

    Merci de votre aide
    vendredi 10 juillet 2009 13:35
  • J'ai essayé avec votre code (feature.xml, elements.xml, et la classe du contrôle) et pour moi ça fonctionne. J'ai juste modifié l'ID des custom actions pour qu'ils n'aient pas tous les 2 le même, et supprimé le featurereceiver dans le feature.xml.

    Niveau rendu graphique c'est une barre blanche, mais elle a le mérite d'exister :)

    Avez-vous vous aussi une barre blanche qui ressemble à une entrée de menu ?
    Si ce n'est pas le cas il doit s'agir d'un problème de déploiement.


    http://blogs.developpeur.org/anouvel
    vendredi 10 juillet 2009 16:04
  • Le log de SharePoint indique peut être quelquechose au moment ou vous affichez une page où le contrôle est sensé apparaitre, pourriez-vous y jeter un coup d'oeil ?
    http://blogs.developpeur.org/anouvel
    • Marqué comme réponse BougRun mercredi 15 juillet 2009 07:03
    vendredi 10 juillet 2009 16:10
  • J'ai regardé les logs de Sharepoint et j'ai trouvé un erreure qui m'était passé sous le nez :


    Failed to create a control from assembly 'CustomActionControlClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abf59b3ca9443f64', class 'CustomActionControlClass.MyCustomAction': Le contrôle associé au nom d'assembly « CustomActionControlClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abf59b3ca9443f64 » et au nom de classe « CustomActionControlClass.MyCustomAction » n'est pas autorisé pour le site Web à l'URL « http://moss-dev ». Le type n'est pas inscrit comme fiable.

    J'ai alors vérifié mon fichier SolutionConfig.xml, j'avais bien les balises SafeControl dans Assemblies ms SafeControlSettings était à False


    <SafeControlSettings>True</SafeControlSettings>

    Une fois que j'ai relancé le déploiment de ma solution j'ai rencontré une erreur de déploiement :


    Cette solution contient des ressources dont l'étendue se situe au niveau d'une application Web et doit être déployée sur une ou plusieurs applications Web.
    

    Je suis alors tombé sur ton post . J'ai donc rajouté -allcontenturls dans ma commande du fichier targets généré par STSDEV :


    <Exec Command="$(STSADM) -o deploysolution -name $(PackageName) -immediate -allowgacdeployment -allcontenturls -force" />

    Puis j'ai fermé et réouvert ma solution ds VS pr qu'il prenne en compte ces modification. J'ai relancé le déploiement et là ca marche mieux !

    Merci de ton aide
    • Marqué comme réponse BougRun mercredi 15 juillet 2009 07:03
    • Modifié BougRun mercredi 15 juillet 2009 10:01
    mercredi 15 juillet 2009 07:00
  • J'ai trouvé pkoi ds le rendu graphique on a qu'une barre blanche, cela est du au fait que je met mon controle ds un NewMenu, si je le met ds une ActionMenu ca marche beaucoup mieux. C'est un pb de CSS, pr le résoudre il faut rajouter ce bout de code :
      protected override void Render(System.Web.UI.HtmlTextWriter writer)
            {
                RenderChildren(writer);
            }
    Source
    mercredi 15 juillet 2009 10:15