none
Transformer code inlinde en code behind du onload d'une page. RRS feed

  • Question

  • Bonjour,

    je viens ici pour trouver une méthode, étant débutant en développement sous SharePoint, voilà mon objectif :
    je souhaite créer une action qui depuis le menu d'un élément d'une liste renvoie vers une nouvelle page mapage?listId={listId}&ItemId={ItemId}  qui aurait la structure suivante :
    1- webpart avec metadata de l'élément(Item)
    2- listview webpart d'une librairie dont les documents sont liés à l'élément(item)

    j'arrive à modifer une page à l'aide d'une appli windows sous VS 2005. Mais lorsque je place le code ci-dessus inline dans une fonction OnLoad , il me casse la listview webpart de la librairie.

    je souhaitais savoir quelle est la méthode à suivre pour placer le code behind. J'ai lu sur ce lien http://avinashkt.blogspot.com/2009/06/how-to-write-server-side-c-code-in.html qu'il fallait créer une sous-classe de LayoutsPageBase, mais on conserve quand même notre masterPage?
    Et si il y avait un tutorial plus précis à suivre comment placer la DLL. 
    Aussi  dans le OnLoad du codeBehind, on peut utiliser les methodes : request.params?

    Merci d'avance de vos conseils et de votre aide,

    (PS: si quelqu'un sait pourquoi l'action 2 ci-dessous casse la listviewwebpart?)

    le code ci-dessous


    try
                {
                    SPSite site = new SPSite("myserver");
                 SPWeb web = site.AllWebs["dede"];
                    //site.AllowUnsafeUpdates = true;
                 //SPFile file = web.GetFile("testMe.aspx");
                    
                    SPListItemCollection myItems= web.Lists["Pages"].Items;
                    foreach (SPListItem myItem in myItems)
                        if (myItem.Name == "testAgain.aspx")
                        {
                            PublishingPage myPage = PublishingPage.GetPublishingPage(myItem);
                            // Check out the page if it is not checked out yet.
                            if (myPage.ListItem.File.CheckOutStatus == SPFile.SPCheckOutStatus.None)
                            {
                                myPage.CheckOut();
                            }
                            using (SPLimitedWebPartManager man = web.GetLimitedWebPartManager("Pages/testAgain.aspx", PersonalizationScope.Shared))
                            {
                                bool AllowUnSafeUpdates = man.Web.AllowUnsafeUpdates;
                                foreach (Microsoft.SharePoint.WebPartPages.WebPart wp in man.WebParts)
                                {
                                    if (wp.Title == "testTitre")
                                    {
                                        using (ContentEditorWebPart _ContentEditorWebPart = (ContentEditorWebPart)wp)
                                        {
    //action1
                                                                        }
                                    if (wp.Title == "testCafe")
                                    {
                                       //action2  
    using (ListViewWebPart _ListViewWebPart = (ListViewWebPart)wp)
                                        {
                                            SPList listA = web.Lists["testCafe"];
                                            SPView doclibview = listA.Views["Tous les documents"];
                                            Guid guid = new Guid(_ListViewWebPart.ViewGuid);
                                            SPView webPartView = listA.Views[guid];
                                            webPartView.ViewFields.DeleteAll(); // deleting the existing view fields for adding new one
                                            foreach (string strField in doclibview.ViewFields)
                                            {
                                                webPartView.ViewFields.Add(strField);
                                            }
                                            //Build the QPQuery
                                            string strQueryKeyword = string.Empty;
                                            StringBuilder strPreQuery = new StringBuilder("<Where><Contains>");
                                            StringBuilder strPostQuery = new StringBuilder("</Value></Contains></Where>");                                       
                                            strQueryKeyword = "<FieldRef Name='Necessaire'/><Value Type='Text'>";
                                            SPQuery oQuery = new SPQuery();
                                            oQuery.Query=strPreQuery.ToString() + strQueryKeyword + "cafe" + strPostQuery.ToString();
                                            webPartView.Query = oQuery.Query;
                                            webPartView.RowLimit = doclibview.RowLimit;
                                            webPartView.ViewEmpty = doclibview.ViewEmpty;
                                            webPartView.ViewFooter = doclibview.ViewFooter;
                                            webPartView.ViewHeader = doclibview.ViewHeader;
                                            webPartView.Scope = doclibview.Scope;
                                            webPartView.GroupByFooter = doclibview.GroupByFooter;
                                            webPartView.GroupByHeader = doclibview.GroupByHeader;
                                            webPartView.Update();
                                            _ListViewWebPart.ViewGuid = webPartView.ID.ToString("B").ToUpper();
                                            _ListViewWebPart.Visible = true;
                                            //_ListViewWebPart.FilterString = "FilterField1=Necessaire&FilterValue1=cafe";
                                            try
                                            {
                                                if (myPage.ListItem.File.CheckOutStatus == SPFile.SPCheckOutStatus.None)
                                                {
                                                    myPage.CheckOut();
                                                }
                                                man.SaveChanges(_ListViewWebPart);
                                            }
                                            catch (Exception ex)
                                            {
                                                pDebug(ex.Message);
                                            }
                                            finally
                                            {
                                                man.Web.AllowUnsafeUpdates = AllowUnSafeUpdates;
                                            }
    }} } myPage.Update(); myPage.CheckIn(""); if (myPage.ListItem.ParentList.EnableVersioning) { myPage.ListItem.File.Publish(""); } } } pDebug("action réussie a-priori et terminée"); }


               

    jeudi 18 juin 2009 16:12

Toutes les réponses

  • Bonjour,

    Pour créer une page utilisant du code inline, vous allez devoir le placer dans une assembly signée et placée dans le GAC (il est aussi possible de ne pas la signer et de la placer dans le répertoire bin de l'application, mais cette manière de faire étant plus compliquée, je vous conseille dans un premier temps de la placer dans le GAC).

    Votre page devra alors indiquer dans la balise <% Page %> le nom complet de l'assembly et de la classe correspondante. Il est effectivement conseillé d'hériter de la classe LayoutsPageBase pour développer une page applicative, ce qui vous fera notamment bénéficier des propriétés this.Web, this.ListItem, etc. 

    Pour facilier le développement/déploiement, vous pouvez vous inspirer de ce post : http://blogs.developpeur.org/anouvel/archive/2009/04/25/sharepoint-optimiser-le-temps-de-d-veloppement-et-packager-avec-wspbuilder.aspx
    Créer une page d'application pour WSS 3.0 : http://msdn.microsoft.com/en-us/library/bb418732.aspx

    Si votre page hérite de LayoutsPageBase il s'agira d'une page applicative, son url sera http://nomdedomaine/_layouts/nompage.aspx
    La master page utilisée sera en principe application.master situé dans le répertoire 12\TEMPLATE\LAYOUTS
    Elle ne sera pas dans une bibliothèque de pages et ne pourra donc ni être publiée, ni extraite. Vous pouvez cependant y placer des web parts et affecter des valeurs à leurs propriétés dynamiquement.

    Si il faut qu'elle soit stockée dans la bibliothèque des pages de votre site, l'interet étant de pouvoir en créer plusieurs, alors il vous faudra développer un modèle de page, qui devra hériter de PublishingLayoutPage. La master page utilisée sera celle de votre site.
    Voici 2 liens concernant le développement de Modèles de pages :
    http://ablog.apress.com/?p=1248
    http://weblogs.asp.net/jimjackson/archive/2007/11/05/create-a-new-page-layout-in-sharepoint-2007-feature-based.aspx


    Concernant votre erreur, je pense qu'il y a un problème de conception, car si j'ai bien compris vous modifiez la page que vous êtes en train d'afficher. Il vaudrait mieux ne pas extraite/publier la page courante, affecter des propriétés aux contrôles et web parts pendant l'execution devrait suffire.

    J'espère que cela répond à votre question


    http://blogs.developpeur.org/anouvel
    vendredi 19 juin 2009 08:25
  • Merci pour cette longue réponse développée,

    je vais tester une dll d'une classe PublishingLayoutPage pour ma page qui utilise la masterpage classique.
    je reviendrai pour noter j'y arrive.

    pour information:

    "Concernant votre erreur, je pense qu'il y a un problème de conception, car si j'ai bien compris vous modifiez la page que vous êtes en train d'afficher.
    vous avez bien compris

    Il vaudrait mieux ne pas extraite/publier la page courante, vous avez bien compris le problème :
    1- je vais tester sans extraire/publier...

    affecter des propriétés aux contrôles et web parts pendant l'execution devrait suffire.
    2- Comment faire cela?

    Dans tous les cas, merci de votre réponse précédente.

    Noche


    vendredi 19 juin 2009 09:42
  • Dans la page applicative, côté aspx, vous devriez avoir une balise correspondant à votre webpart, quelquechose comme ceci :

    <sharepoint:ListViewWebPart id="lvwp" runat="server" />

    Pour obtenir une référence à cette webpart dans votre code, coté .cs donc, il suffit de déclarer une variable du même type et du même nom que la webpart :

    protected ListViewWebPart lvwp;

    Vous pourrez alors modifier les propriétés de la webpart dans votre code de la manière habituelle :

    lvwp.Propriete1 = valeur1;

    http://blogs.developpeur.org/anouvel
    vendredi 19 juin 2009 09:58
  • Merci,

    j'essaierais avec ceci en ligne.
    j'ai créé une solution wsp qui affiche bien mon action sur un élément de la liste.

    Par contre, j'ai créé ma page en ajoutant mon assembly que j'ai copié dans le gac et vérifié le publickeytoken. seulement quand je teste la page : j'ai cette erreur :

    Une erreur est survenue lors du traitement de . Impossible de charger le fichier ou l'assembly 'DLLFor-EssaiPage' ou une de ses dépendances. Le fichier spécifié est introuvable.

    j'ai ajouté mon assembly comme ceci en haut de la page :

    <%@ Assembly Name="DLLFor-EssaiPage" %>
    <%@ Page Language="C#" MasterPageFile="~masterurl/custom.master" Inherits="DLLFor-EssaiPage",Version=1.0.0.0,Culture=neutral,PublicKeyToken=b9bb9194846fecc4"  %>

    Si tu as une idée de ce qui pose problème? merci d'avance

    Noche

    vendredi 19 juin 2009 12:06
  • On avance :)

    Je vois 2 erreurs :

    La balise <% Assembly %> n'indique pas le nom complet de l'assembly, ce qui explique le message d'erreur. 
    Tu peux récupérer le nom complet en faisant un copier-coller (pour être sûr) depuis l'utilitaire Reflector, ou en depuis les propriétés de ton assembly dans C:\Windows\Assembly.
    Il faudrait plutôt mettre :
    <% Assembly Name="DLLFor-EssaiPage, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b9bb9194846fecc4" %>
    Dans la balise <% Page %> l'attribut Inherits est mal renseigné : il faut y indiquer le nom (avec namespace) de la classe. L'assembly étant chargée grâce à la balise précédente, inutile de la repréciser.
    De plus, la master page devrait être Application.master si il s'agit d'une page applicative.
    Il faudrait plutôt mettre :
    <%@ Page Language="C#" MasterPageFile="~/_layouts/application.master" Inherits="monnamespace.maclassepage"  %>

    http://blogs.developpeur.org/anouvel
    vendredi 19 juin 2009 12:22
  • thanks again,

    1- je ne vois pas quel peut être le nom complet de la dll sinon celui-là :

    depuis l"assembly :
    nom du fichier d'origine :DLLFor-EssaiPage.dll
    nom du produit : DLLFor-EssaiPage
    nom interne : DLLFor-EssaiPage.dll

    depuis reflector:

    // Assembly DLLFor-EssaiPage, Version 1.0.0.0
    
    Location: C:\Documents and Settings\...Mes documents\Visual Studio 2005\Projects\DLLFor-EssaiPage\DLLFor-EssaiPage\Deploy\GAC\DLLFor-EssaiPage.dll
    Name: DLLFor-EssaiPage, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b9bb9194846fecc4
    Type: Library


    2- oui par contre je n'ai pas indiqué la classe. merci.


    Mais je reste bloqué au point 1.
    merci encore.

    vendredi 19 juin 2009 12:49
  • C'est celui ci : DLLFor-EssaiPage, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b9bb9194846fecc4
    http://blogs.developpeur.org/anouvel
    vendredi 19 juin 2009 12:59
  • j'ai cette erreur :

    Une erreur est survenue lors du traitement de . Impossible de charger l'assembly 'Version=1.0.0.0,Culture=neutral,PublicKeyToken=b9bb9194846fecc4"'. Vérifiez qu'il est compilé avant d'accéder à cette page.

    avec cette config de page (j'ai laissé les register) :

    <%@ Reference VirtualPath="~masterurl/custom.master" %>
    <%@ Assembly Name="DLLFor-EssaiPage, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b9bb9194846fecc4" %>
    <%@ Page Language="C#" MasterPageFile="~masterurl/custom.master" Inherits="DLLFor-EssaiPage.maClasseEssai",Version=1.0.0.0,Culture=neutral,PublicKeyToken=b9bb9194846fecc4"  %>
    <%@ Register TagPrefix="SharePointWebControls" Namespace="Microsoft.SharePoint.WebControls"
        Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
    <%@ Register TagPrefix="WebPartPages" Namespace="Microsoft.SharePoint.WebPartPages"
        Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
    <%@ Register TagPrefix="PublishingWebControls" Namespace="Microsoft.SharePoint.Publishing.WebControls"
       Assembly="Microsoft.SharePoint.Publishing, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
    <%@ Register TagPrefix="PublishingNavigation" Namespace="Microsoft.SharePoint.Publishing.Navigation"
        Assembly="Microsoft.SharePoint.Publishing, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9b

    je ne vois pas ...
    vendredi 19 juin 2009 13:11
  • Dans la page applicative, côté aspx, vous devriez avoir une balise correspondant à votre webpart, quelquechose comme ceci :

    <sharepoint:ListViewWebPart id="lvwp" runat="server" />
    

    Pour obtenir une référence à cette webpart dans votre code, coté .cs donc, il suffit de déclarer une variable du même type et du même nom que la webpart :

    protected ListViewWebPart lvwp;
    

    Vous pourrez alors modifier les propriétés de la webpart dans votre code de la manière habituelle :

    lvwp.Propriete1 = valeur1;
    excuse moi de revenir encore, mais tu aurais un exemple d'une structure de ceci? (une page et le code associé qui doit être également d"ployé j'imagine)
    bon, en meme temps, je comprends que ce soit un peu compliqué...

    merci de m'avoir aidé

    noche
    vendredi 19 juin 2009 14:41
  • C'est un problème de syntaxe.

    Il faudrait remplacer

    <%@ Page Language="C#" MasterPageFile="~masterurl/custom.master" Inherits="DLLFor-EssaiPage.maClasseEssai",Version=1.0.0.0,Culture=neutral,PublicKeyToken=b9bb9194846fecc4"  %>


    par

    <%@ Page Language="C#" MasterPageFile="~masterurl/custom.master" Inherits="DLLFor-EssaiPage.maClasseEssai" %>



    Je vois que vous voulez utiliser la master page ~masterurl/custom.master, je ne pense pas (à vérifier) que ca fonctionnera si votre classe hérite de LayoutsPageBase. Voulez vous faire une page applicative ou un modèle de page ?
    http://blogs.developpeur.org/anouvel
    vendredi 19 juin 2009 14:50
  • Merci,
    ce n'est pas pour une page applicative mais bien pour une bien qui utilise la même masterpage que les pages utilisateurs.

    J'ai maintenant l'erreur :

    Une erreur est survenue lors du traitement de . Impossible de charger le type 'DLLFor-EssaiPage.maClasseEssai'.

    J'ai créé une page vueEssai.aspx dans mon site.

    et dans mon code, j'ai construit une bibliotheque de classes (VS2005)  avec la structure suivante :

    namespace DLLFor_EssaiPage
    {
    public class maClasseEssai : Microsoft.SharePoint.Publishing.PublishingLayoutPage
    {
    protected void Page_Load(Object sender, EventArgs e)
    {//voir code de mon poste où je modifie juste les webparts (sans les créer puisque je les ai créés dans la page
    }

     je n'ai que cette méthode dans la dll.

    Je pense que c'est là que je me trompe...
    vendredi 19 juin 2009 15:38
  • Pour information,
    j'ai réalisé avec du code inline (affichage de la première webpart) + redirection d'url contenant le filtre (filterfield=...)) pour afficher la listviewwebpart comme je le souhaitais.
    Cependant, j'aurais souhaité savoir comment le faire en code behind.
    Noche

    lundi 22 juin 2009 09:18
  • Bonjour,

    j'ai trouvé ces 2 liens qui correspondent à votre problématique :
    http://msdn.microsoft.com/en-us/library/bb986729.aspx
    http://mystepstones.wordpress.com/2008/09/22/code-behind-in-layouts-and-master-pages/

    Vu l'erreur, SharePoint ne trouve pas la classe correspondant à votre code-behind. 3 possibilités me viennent à l'esprit :
    - L'assembly qui la contient n'a pas été chargée, ce qui voudrait dire que la balise <%@ Assembly %> est mal écrite,
    - ou que la classe n'a pas été trouvée, probablement à cause d'une erreur dans l'attribut Inherits de la balise <%@ Page %>
    - ou que le namespace de cette classe ne figure pas parmi les safe controls définis dans le Web.Config de votre web application.

    Si vous déployez votre projet via un fichier .wsp généré par WSPBuilder, le namespace devrait être ajouté automatiquement.
    Comment déployez vous votre développement ?
    http://blogs.developpeur.org/anouvel
    mercredi 24 juin 2009 13:55
  • Bon, j'ai un peu abandonné mais voilà mes réponses

    1- J'ai défini comme ceci..

    <%@ Assembly Name="DLLFor-EssaiPage, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b9bb9194846fecc4" %>
    <%@ Page Language="C#" MasterPageFile="~masterurl/custom.master" Inherits="DLLFor-EssaiPage.maClasseEssai" meta:webpartpageexpansion="full" meta:progid="SharePoint.WebPartPage.Document"  %>

    2- J'ai utilisé un wspbuilder donc le namespace a bien été ajouté



    Peut-être en conservant l'héritage et en ajoutant un prefix...
    Merci en tout cas pour ces conseils et les liens,,

    Noche

    mercredi 24 juin 2009 14:22
  • Les déclarations ont l'air correctes. Il s'agit peut-être d'un problème d'utilisation ?

    L'idée ici est de créer un modèle de page, donc un fichier .aspx qui devra être situé dans la bibliothèque _catalogs/masterpage.
    Il est possible d'utiliser une feature pour provisionner le modèle de page dans _catalogs/masterpage via un module (on y precise aussi le page content type associé, une image de preview, un titre et une description).

    Une fois celle-ci dans le répertoire, lorsque l'on fait "Créer une page" dans SharePoint, notre modèle de page devrait apparaitre dans la liste des modèles possibles.

    Est-ce bien le cheminement que tu utilises ?
    En principe le code inline n'est pas autorisé dans un modèle de page, car SharePoint lève une erreur à l'execution dès que le fichier est customisé via SharePoint Designer.


    http://blogs.developpeur.org/anouvel
    mercredi 24 juin 2009 15:05