none
Mise à jour composant WebPart RRS feed

  • Question

  • Tout d'abord bonjour à tous,

    Pour situer un peu le contexte, j'ai développé un composant WebPart en C# il y a quelque temps, il s'agit d'un carrousel. Ce dernier utilise une bibliothèque jQurey nommée jGalleryview. Le composant en lui même fonctionne et il est déjà implémenté dans plusieurs pages web depuis maintenant un moment. Seulement voilà, il m'a été demandé d'apporter des modifications à ce carrousel. J'ai donc procédé au développement de ces nouvelles fonctionnalités.

    Le vrai problème se situe au niveau de la mise à jour du composant WP depuis mon environnement de développement jusqu'à Sharepoint 2010. Pour mettre à jour mon composant j'ai utilisé la commande powershell basique que voici :

    Update-SPSolution -Identity NomDuWSP.wsp -LiteralPath "SourceDuWSP" -GACDeployment

    Après l'exécution de cette ligne voila le problème que je rencontre : au lieu de remplacer les carrousels déjà existants sur les sites web un message d'erreur s'affiche, le voici :

    Erreur du composant WebPart : Une erreur s'est produite.

    [ArgumentException: The serialized data is invalid.]
      at System.Web.UI.ObjectStateFormatter.Deserialize(Stream inputStream)
      at Microsoft.SharePoint.WebPartPages.Utility.DeserializeByteArrayToObject(Byte[] bytes)
      at Microsoft.SharePoint.WebPartPages.BinaryWebPartDeserializer.LoadInitialWebPart()
      at Microsoft.SharePoint.WebPartPages.BinaryWebPartDeserializer.Deserialize()
      at Microsoft.SharePoint.WebPartPages.SPWebPartManager.CreateWebPartsFromRowSetData(Boolean
    onlyInitializeClosedWebParts)

    [TypeLoadException: Could not load type 'SlideImage.MySlide.MySlide+siteLists' from assembly 'SlideImage, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6290928c9a9b5d7b'.]
      at System.RuntimeTypeHandle._GetTypeByName(String name, Boolean throwOnError,
    Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark, Boolean loadTypeFromPartialName)
      at System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase,

    Boolean reflectionOnly, StackCrawlMark& stackMark)
      at System.RuntimeType.PrivateGetType(String typeName, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark)
      at System.Type.GetType(String typeName, Boolean throwOnError)
      at System.Web.UI.ObjectStateFormatter.DeserializeType(SerializerBinaryReader reader)
      at System.Web.UI.ObjectStateFormatter.DeserializeValue(SerializerBinaryReader reader)
      at System.Web.UI.ObjectStateFormatter.DeserializeValue(SerializerBinaryReader reader)
      at System.Web.UI.ObjectStateFormatter.Deserialize(Stream inputStream)

       

    Après avoir fait de nombreux tests pour comprendre ce qu'il se passait, je me suis aperçu que le problème vient des listes déroulantes que j'ai ajouté dans le paramétrage du composant WebPart. Je m'explique, j'ai ajouté différentes fonctionnalités à ce carousel et la plupart sont à définir dans le paramétrage du composant WP comme la vitesse de défilement des images, la taille du carrousel, etc. Et, en fin de compte, seules les listes déroulantes que j'ai ajouté pose problème. Si je laisse le paramétrage de ces listes par défaut et que je lance la ligne powershell, les carrousels se changent sans problème. En revanche si je choisis de changer la valeur de la liste déroulante, le message ci-dessus s'affiche. Le problème ne se produit pas si je change la valeur d'un champ texte ou d'une checkbox. Je ne comprends pas pourquoi, voici ci dessous le code C# qui permet de rajouter une liste déroulante dans le paramètrage d'un composant WP :

    public enum siteLists
    {
         Diapo,
         DiapoFilmstrip,
         Filmstrip
    };
    private siteLists TypeAffichage;
    [Category("Slider"), WebBrowsable(true), WebDescription("Type d'affichage"), WebDisplayName("Type d'affichage du carrousel"), Personalizable(), DefaultValue(siteLists.DiapoFilmstrip)]
    public siteLists AllowTypeAffichage
    {
         get { return TypeAffichage; }
         set { TypeAffichage = value; }
    }

    Je suis désolé pour le pavé et je suis conscient que ma demande nécessite un certain de réflexion. N'hésitez à revenir vers moi en cas de question ou si vous avez besoin d'un complément d'information.


    • Modifié Arquantel mardi 17 novembre 2015 07:50
    mardi 17 novembre 2015 07:49

Toutes les réponses

  • Bonjour,

    Pourquoi ne pas plutôt définir votre valeur par défaut dans le fichier WebPart en XML.

    Ex :

    <property name="siteLists" type="SharePointProject1.VisualWebPart1.VisualWebPart1+MyEnum, $SharePoint.Project.AssemblyFullName$">Diapo</property>

    Raison : 

    The enum property requires a special approach and it requires the full name of the enum and the assembly name to identify the enumerator.

    Voici la source : 

    http://www.ashokraja.me/articles/How-to-create-a-custom-property-and-set-a-default-value-in-a-SharePoint-2013-Visual-WebPart

    Merci

    Samuel Levesque | http://sharepointerie.com | SVP utiliser le bouton "Marquer comme réponse" sur les réponses qui vous aide car cela permet aux personnes qui peuvent rencontrer le même problème que vous, de retrouver rapidement quelle est la réponse qui a résolu leur problème. De plus, cela encourage aussi la personne qui a répondu à votre question, à répondre aux suivantes...



    mercredi 18 novembre 2015 05:26
  • Je ne suis pas sur que cela change la donne à mon problème. Ces carrousels sont installés sur plusieurs pages avec des paramétrages différents et le problème survient dès que je change la valeur par défaut des listes déroulantes. Alors que je définisse une valeur par défaut dans un fichier xml ou dans mon fichier source à partir du moment ou le paramètrage des listes déroulantes est différent de la valeur par défaut l'update des carrousels plantera.

    J'ai ajouté dans le paramètre de mon composant WP une case à cocher et quand je change la valeur par défaut je n'ai aucun problème lors de la mise à jour de la WP.


    • Modifié Arquantel mercredi 18 novembre 2015 15:34
    mercredi 18 novembre 2015 15:31
  • Bonjour,

    Je crois que le problème viens du "DefaultValue(siteLists.DiapoFilmstrip" .

    Tel que décrit dans cet article : http://www.ashokraja.me/articles/How-to-create-a-custom-property-and-set-a-default-value-in-a-SharePoint-2013-Visual-WebPart

    There is an another attribute called as Default Value attribute, this can be used to set a default value for this property. Unfortunately this property doesn’t seems to work properly. The below section provides an alternative approach for setting default value.

    Pouvez-vous essayer de retirer ce paramètre, faire un Update-Solution, ensuite supprimer l'instance de la WebPart et en ajouter une nouvelle à partir de la galerie des composants WebPart.

    Il semble être possible de télécharger les sources alors peut-être qu'un exemple avec un Enum qui fonctionne vous permettra d'isoler le problème.

    Merci

    Samuel Levesque | http://sharepointerie.com | SVP utiliser le bouton "Marquer comme réponse" sur les réponses qui vous aide car cela permet aux personnes qui peuvent rencontrer le même problème que vous, de retrouver rapidement quelle est la réponse qui a résolu leur problème. De plus, cela encourage aussi la personne qui a répondu à votre question, à répondre aux suivantes...


    vendredi 20 novembre 2015 04:24
  • Je vous remercie, je vais essayer la méthode décrite dès que possible. Je vous retiens au courant.
    vendredi 20 novembre 2015 15:43
  • Bonjour,

    J'ai procédé à plusieurs tests suite à votre post précédent, cela n'a pas résolu mon problème mais j'ai pu retirer certaines conclusions.

    Voici le code de ma liste déroulante ainsi que la ligne xml pour initialiser la valeur par défaut de ma liste déroulante.

    // Liste déroulante :

    public enum OrdreTri
    {
       Alphabétique,
       Personnalisé
    }
    private OrdreTri Tri;
    [Category("Slider"), WebBrowsable(true), WebDescription("Position des images"), WebDisplayName("Ordre d'apparition des images"), Personalizable(PersonalizationScope.Shared)]
    public OrdreTri AllowTri
    {
       get { return Tri; }
       set { Tri = value; }
    }

    //valeur par défaut :

    <property name="AllowTri" type="SlideImage.MySlide.MySlide+OrdreTri, $SharePoint.Project.AssemblyFullName$">Personnalisé</property>

    Après avoir supprimé le composant, installé la nouvelle solution puis réinstallé le composant. J'ai bien constaté que lors de la réinstallation du composant la valeur par défaut a belle et bien changé (=Personnalisé).

    Cependant lorsque je garde cette valeur par défaut (c'est à dire "Personnalisé") et que je met à jour le composant WP avec une version antérieure afin de voir si la modification ce passe sans problème, le message ci-dessous apparaît :

    [ArgumentException: The serialized data is invalid.]
      at System.Web.UI.ObjectStateFormatter.Deserialize(Stream inputStream)
      at Microsoft.SharePoint.WebPartPages.Utility.DeserializeByteArrayToObject(Byte[] bytes)
      at Microsoft.SharePoint.WebPartPages.BinaryWebPartDeserializer.LoadInitialWebPart()
      at Microsoft.SharePoint.WebPartPages.BinaryWebPartDeserializer.Deserialize()
      at Microsoft.SharePoint.WebPartPages.SPWebPartManager.CreateWebPartsFromRowSetData(Boolean onlyInitializeClosedWebParts)

    [TypeLoadException: Could not load type 'SlideImage.MySlide.MySlide+OrdreTri' from assembly 'SlideImage, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6290928c9a9b5d7b'.]
      at System.RuntimeTypeHandle._GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark, Boolean loadTypeFromPartialName)
      at System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark)
      at System.RuntimeType.PrivateGetType(String typeName, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark)
      at System.Type.GetType(String typeName, Boolean throwOnError)
      at System.Web.UI.ObjectStateFormatter.DeserializeType(SerializerBinaryReader reader)
      at System.Web.UI.ObjectStateFormatter.DeserializeValue(SerializerBinaryReader reader)
      at System.Web.UI.ObjectStateFormatter.DeserializeValue(SerializerBinaryReader reader)
      at System.Web.UI.ObjectStateFormatter.Deserialize(Stream inputStream)

    J'en suis venu à la conclusion que le problème n'est pas du au changement de la valeur par défaut de la liste déroulante, puisqu'ici j'ai gardé la valeur par défaut définie dans le fichier xml. Le problème survient quand la valeur de la liste déroulante est différente de la première valeur de la liste. Dans notre exemple, si la valeur de la liste n'est pas égale à "Alphabétique" la mise à jour crash.

    Autre test, j'ai retiré la déclaration de la valeur par défaut -> même problème.

    J'espère que ces informations vous seront utiles.

    mardi 24 novembre 2015 10:15