Archive

Articles taggués ‘C#’

Sharepoint – Anonymous Access pour une Application Page

Pour autoriser l’accès anonyme à une page applicative, votre page ne doit plus hériter de la classe LayoutsPageBase mais UnsecuredLayoutsPageBase (MSDN).
De plus
, il faut surcharger la propriété AllowAnonymousAccess (qui renvoie False par défaut) et lui faire renvoyer True.

public partial class AVASamplePage : UnsecuredLayoutsPageBase
{
    protected override bool AllowAnonymousAccess
    { 
        get { return true; }
    }
    protected void Page_Load(object sender, EventArgs e)
    {
    }
}
Categories: Non classé Tags: ,

Modifier les propriétés personnalisées d’une WebPart en C#

Pour avoir des paramètres personnels dans la liste des propriétés d’une WebPart il faut utiliser les attributs « Personalizable » et « WebBrowsable ». (« Personalizable » pour que sa valeur soit persistante – stockée en BDD – et « WebBrowsable » pour que le paramètre apparaisse dans les propriétés custom.)

[Personalizable(PersonalizationScope.User), WebBrowsable]
public String myCustomProp { get; set; }


Ainsi, en éditant les propriétés de la WebPart il est possible de modifier la valeur de ce paramètre. Et cette valeur est sauvegardée !
Si on modifie cette propriété « programmaticalement » de cette façon :

myCustomProp = "1 2, 1 2 c'est un test !";

la valeur de notre propriété sera modifiée mais dès le PostBack suivant elle aura repris sa valeur précédente. Comme si la nouvelle valeur n’était pas sauvegardée … Et ouais !

Solution : Il faut appeler la méthode SetPersonalizationDirty() pour « enregistrer » dans la BDD la nouvelle valeur.

myCustomProp = "1 2, 1 2 c'est un test !";
SetPersonalizationDirty();

Je cite MSDN :
« La méthode SetPersonalizationDirty définit un indicateur qui spécifie que les données d’état du contrôle ont été modifiées (personnalisées) sur un contrôle WebPart, et que le contrôle WebPartManager doit par conséquent rendre les données de personnalisation persistantes dans un stockage à long terme. »
Plus d’infos ici : http://msdn.microsoft.com/fr-fr/library/ms157359.aspx

Supprimer un ListTemplate SharePoint

Les modèles de listes (ou ListTemplate) sont des styles prédéfinis de listes pour SharePoint, stockés dans la librairie « Gallerie de modèles de listes ». SharePoint permet de gérer ces listes via le code spécifique.

Ainsi pour ajouter un style (à partir d’une liste déjà existante) on peut utiliser la méthode :

maList.SaveAsTemplate("Custom_List_Template", "Custom_List_Template", "Description", false);

Mais, et j’insiste sur le Mais, si ce ListTemplate existe déjà (même nom de fichier / même nom de ListTemplate) il sera impossible  de réécrire par dessus : une exception sera levée disant que ce ListTemplate existe déjà.

Pour supprimer l’ancien ListTemplate il existe deux méthodes, une qu’on trouve facilement sur les blogs anglophones (et qui marche, mais pas partout ! Vous allez voir !) et une deuxième qui fonctionne à tout les coups.

La première consiste à récupérer la liste s’appelant « List Template Gallery » et à supprimer votre ListTemplate :

using (SPSite oSPsite = new SPSite("http://myserver/site"))
{
 using (SPWeb oSPWeb = oSPsite.OpenWeb())
 {
  SPList objLstTempGallery = oSPWeb.Lists["List Template Gallery"];
  foreach (SPListItem objLstItem in objLstTempGallery.Items)
  {
   if (objLstItem.Title == "Custom_List_Template")
   {
    objLstItem.Delete();
    objLstTempGallery.Update();
    break;
   }
  }
 }
}

source

Cette méthode fonctionne … mais uniquement si votre SharePoint est en anglais ! Et oui ! S’il est en français la liste ne s’appelle plus « List Template Gallery » mais « Gallerie de modèles de listes ».
(J’ai découvert ça à mes dépends : tout marchait sur la machine de développement en anglais – tout les développeurs sont bilingues, c’est bien connu ;) – et plus rien sur la machine de production en français … Help ! :) )

Pour récupérer la liste de ListTemplate il faut donc passer par une autre méthode (qui fonctionne avec toutes les langues) :

using (SPSite oSPsite = new SPSite("http://myserver/site"))
{
 using (SPWeb w= oSPsite.OpenWeb())
 {
  SPList l = w.GetCatalog(SPListTemplateType.ListTemplateCatalog);
  foreach (SPListItem o in l.Items)
  {
   if (o.Title == "Custom_List_Template")
   {
    o.Delete();
    l.Update();
    break;
   }
  }
 }
}

Lire du XML contenant des Namespaces en utilisant XLinq.XElement

Cet article montre comment lire un fichier XML contenant des Namespaces.

Je prendrai pour exemple un flux RSS venant d’un blog WordPress :



  
    
    
      Du contenu
    
  
  
    
    
      Encore du contenu
    
  

Pour récupérer le texte de la balise encoded on ne peut pas faire :

Element("encoded").Value

Illustrons la solution par un petit bout de code :

class Program
    {
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load("example.xml");
            XNamespace n = "http://purl.org/rss/1.0/modules/content/";

            foreach (XElement el in doc.Root.Descendants("item"))
            {
                Console.WriteLine(el.Element("title").Value);
                Console.WriteLine(el.Element(n+"encoded").Value);
            }
            Console.ReadKey();
        }
    }
Categories: Non classé Tags: ,

Binding et Getter Setter

Lors d’un développement ’rapide’ pour tester des fonctionalités WPF, j’ai créé une classe ‘Car’ avec des attributs en public.

public class Car
{
    public String Name;
}

Et lorsque j’ai voulu binder cette attribut rien ne s’affichait.

DisplayMemberBinding="{Binding Name}"

A force de tatonement j’ai fais passer mon champ public en propriété public :

public String Name {get; set;}

et « O miracle » … le binding était fait ! J’avoue ne pas avoir compris tout de suite la différence puis un gentil-monsieur-d-un-forum m’a redirigé vers cette article : http://blogs.msdn.com/wpfsdk/archive/2006/10/19/wpf-basic-data-binding-faq.aspx
Plus particulièrement paragraphe « What’s bindable ? ».
« You can bind to the entire object or public properties, sub-properties, and indexers of the object. Fields are not supported. »

Conclusion : Les champs publics c’est mal ! Parceque ce n’est pas ‘Bindable’, parceque c’est contraire au conventions (on le savait) parceque tout le monde peut les bidouiller et qu’aucun controle ne peut être fait. La propriété va faire référence à un champ privé en passant par les getters/setters. Ainsi on pourra effectuer des modifications sur une donnée en la recevant ou avant de l’envoyer (filtrage, vérification, calcul, conversion … ).

Categories: Non classé Tags: ,