mercredi 30 juin 2010

MOSS 2007 - Moss Record Center

Le record center de moss est un site permettant de stocker des copies des fichiers présent sur d’autres sites de la ferme.


Leur envoie peut se faire par code avec la méthode « SendToOfficialFile » d’un SPFile, par le web service « officialfile.asmx » contenu dans le répertoire « _vti_bin » de votre record center ou simplement par « click » sur un fichier présent dans une liste.



Pour activer le record center voici la démarche à suivre :
Le record center est un site SharePoint disponible dans l’onglet « Entreprise » de création de site. Celui-ci peut être situé dans n’importe quelle sous collection de site où sur sa propre webApp.
Une fois le site fait, il faut paramétrer la ferme pour l’utiliser. En effet il ne peut y avoir qu’un seul record center par ferme.
Le paramétrage ce fait dans la centrale d’administration, onglet « application management », encadré « External Service Connections », liens « Records center ». Il faut ensuite renseigner l’emplacement du web service. En général : http://monrecordcenter/_vti_bin/officialfile.asmx.



Voila, c’est opérationnel.
La problématique suivante est : Où vont aller mes fichiers ? En effet on ne peut pas envoyer tous les fichiers n’importe où. Le record center dispose de règles de routage.

Le record center dispose d’une List nommée : Record Routing. Chaque item de cette liste défini les règles à appliquer pour chaque transfert de fichier. Il n’y a que cinq propriétés :
Le titre de la règle, la description, la « location » qui est en fait le nom de la document library du record center qui recevra le fichier, un alias qui correspond au nom du dossier source sur la liste contenant le fichier d’origine et enfin le paramètre « Default » qui définit la liste à utiliser par défaut pour les fichiers ne correspondant à aucune des règles.



Attention à bien configurer les contents Types des listes cibles afin de conserver les informations pendant le transfert.

A chaque transfert de fichier Moss tentera de faire coïncider les content type source avec la cible. De plus dans le dossier properties vous retrouverez sous forme de fichier XML les méta datas du fichier source.

Source : http://blog.thekid.me.uk/archive/2007/04/13/using-the-moss-records-center.aspx

http://blog.thekid.me.uk/archive/2007/04/13/records-center-routing-in-moss.aspx

jeudi 24 juin 2010

MOSS 2007 - Envoyer un fichier vers le record center par code

Envoyer un fichier vers le record center par le code ? En réalité très simple.
NB : si vous avez un problème avec le code suivant, sachez que vous devrez peut etre utiliser un runWithElevetedPrivilege et/ou ajouter l'utilisateur à la liste des utilisateurs autorisé sur le record center.

Exemple :

SPSite site = new SPSite(@http://s3b31052/sites/NewSite/NewSite2/NewDocLib/);
SPWeb web = site.OpenWeb(@"NewSite2");
SPFolder folder = web.GetFolder(@"NewDocLib");
SPFileCollection files = folder.Files;
SPFile file = files[@http://s3b31052/sites/NewSite/NewSite2/NewDocLib/document.doc];
string additionalInfo = String.Empty;

OfficialFileResult res = file.SendToOfficialFile(out additionalInfo);



Console.WriteLine(res.ToString());
source :
http://msdn.microsoft.com/en-us/library/ms432811.aspx

http://www.sharepointdev.net/sharepoint--development-programming/notfound-error-while-sending-a-document-to-records-center-programmatically-62025.shtml

jeudi 17 juin 2010

MOSS 2007 - WarmUp du serveur

Vous en avez assez des serveurs SharePoint long à démarrer le matin ? Alors sachez que Microsoft propose un script de WarmUp. Celui-ci se trouve sur le DVD SharePoint beta 2 Resource. Le script ce compose en trois fichiers.


Startup.bat : Dans lequel on définit le host et l’appel au script de warmup : Warmupserver.cmd. Juste avant de démarrer le script il lance le stsadm. Il faut savoir qu’un appel un à stsadm permet de préchauffer l’interface d’administration.

Warmupserver.cmd : Provoque des appels vers les principales pages du host demandé. (Vérifie le nom du serveur, récupère les ports si besoin, la ssp, etc. etc). Le code de ce script reste lisible n’hésitez pas à le consulter.

HTTPRequest.vbs : Script exécutant une requête http avec le XMLHTTP object.


En pièce jointe une archive contenant les trois fichiers : WarmUpServer.zip

jeudi 10 juin 2010

MOSS 2007 - Ajouter un Champs à une liste et dans une des vues

Encore une fois, quelque chose de peut être simple, mais qui pose problème quand on l’a jamais fait ou qu’on a oublié comment faire.

Dans l’exemple suivant on part d’un objet « web » contenant le SPweb.
Ensutie le code est assez explicite.

//Récupération de la liste
SPList Lst = web.Lists["Informations Riches"];
//Ajout du champs à la liste
string name = Lst.Fields.Add("Videos Hits", SPFieldType.Integer, false);
Lst.Update();
//Récupération de la vue
SPView v = Lst.Views[0];
//Modification de la vue
v.ViewFields.Add("Videos Hits");
//Mise à jours
v.Update();
Lst.Update();
web.Update();

Source :
Moi avec le Msdn (Surtout le Msdn)

jeudi 3 juin 2010

MOSS 2007 - Le bouton d'édition a disparu

Que faire quand le bouton d’édition d’une page a disparu ? En général il suffit de vérifier si la page n’est pas extraite par un autre utilisateur ou si il ne manque pas des placeholders. Quand ce n’est pas suffiant cela peut venir du fait que le placeholder de publication de contenu est absent. Pour résoudre le problème il faut inclure une web part zone caché dans le layout de la page.

Placez ce code dans un place holder et le bouton reviendra.

<WebPartPages:WebPartZone runat="server" AllowPersonalization="false" Visible="False" id="HiddenToAddEdit" title="ToHiddenForEdit">
<ZoneTemplate>
</ZoneTemplate>
</WebPartPages:WebPartZone>

Source :





jeudi 27 mai 2010

MOSS 2007 – Récupération d’une valeur unique ou multiple d’un profil utilisateur

Récupérer une valeur unique ou multiple depuis un profil utilisateur ne ce fait pas de la même manière. Voici un petit code d’exemple :

if (Profile[this.UserProfilePropertyName].Count == 1)
return Profile[this.UserProfilePropertyName].Value.ToString();
else
{
StringBuilder ret = new StringBuilder("");
UserProfileValueCollection values = Profile[this.UserProfilePropertyName];
System.Collections.IEnumerator allValues = values.GetEnumerator();
while(allValues.MoveNext())
{
ret.Append(allValues.Current.ToString());
ret.Append(";");
}
return ret.ToString();
}

Source : http://www.sharepoint-tips.com/2008/01/getting-user-profile-values-that.html

samedi 22 mai 2010

SPS 2010 - Formation Sharepoint 2010

Deux liens utiles pour s'auto former sur sharepoint 2010 :

Advanced developer Training : http://msdn.microsoft.com/en-us/sharepoint/ff420377.aspx



Developper sous sharepoint 2010 - Getting Started : http://msdn.microsoft.com/fr-fr/sharepoint/ee513147.aspx
 
Je recommande la lecture du premier lien avant de faire le getting started. Le second lien étant purement technique, l'apport en connaissance est très amoindri si on a pas fait le premier.

jeudi 20 mai 2010

MOSS 2007 – Récupérer tous les dossiers et sous-dossiers d’une liste SharePoint


Dans cet article nous allons voir comment lister tous les
dossiers et sous dossiers d’une Document Library ou d’une liste.

La manière simple, en utilisant une SPQuery
et en modifiant le ViewAttributes.

Voir l’exemple suivant :

SPSite site = SPContext.Current.Site;

SPWeb web = SPContext.Current.Web;

SPList list = web.Lists["Shared
Documents"
];


SPQuery query = new SPQuery();


//Condition
query.Query = “<Where><Eq><FieldRef
Name=’FSObjType’/><Value
Type=’Lookup’>1</Value></Eq></Where>”
;


 query.ViewAttributes = “Scope=’RecursiveAll’”;


SPListItemCollection items = list.GetItems(query);


string folderDetails=“”;


//Get the name and Url for the folder
foreach (SPListItem item in items)
{
folderDetails += “Folder Name:” + item.Name + “<br/>Folder
URL:”
+ web.Url + “/” + item.Url + “<br/>”;

}


Dans la propriété Query du SPQuery il faut mettre la condition FSObjType
égal à 0. C’est le type des dossiers, les Items et Documents sont à 1.

Pour le passage récursif modifier : Scope=RecusirveAll .

Source : http://ktskumar.com/blog/2009/07/10/retrieve-all-folders-from-list/

jeudi 13 mai 2010

MOSS 2007 - RunWithElevatedPrivileges dans les event handler

La méthode RunWithElevatedPrivileges est l’ami du développeur SharePoint. Elle permet de nous attribuer des droits là où l’utilisateur courant n’en dispose pas. De l’impersonification classique.


Dans les webparts tout va bien. Par contre, dans les event handler, dans certains cas, il est possible d’avoir l’erreur suivante : « […] threw an exception of type 'System.UnauthorizedAccessException’ »

En effet, il est obligatoire de créer les objets dans un SPSite car les objets créés en dehors n’auront pas le droit “Full control”, même si ils sont dans un délégué. Le plus simple est de combiner l’utilisation du mot « using » et des « properties » de l’event handler à l’intérieur de l’impersonification.

Voir l’exemple si dessous :

using (SPSite theSite = new SPSite(properties.OpenWeb().Site.ID)) {...}


Source : Dernier paragraphe de http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spsecurity.runwithelevatedprivileges.aspx
(Et oui c’est pour ça que l’erreur est fréquente…), et les commentaires du post suivant : http://www.sharepoint-tips.com/2007/03/event-handler-impersonation-continued.html

jeudi 6 mai 2010

MOSS 2007 - Accèder au SPUser depuis un SPFieldUser

Le username est stocké au format 1# ;username. Pour y accèder plus facilement voici un exemple avec une tasklist :




using (SPSite site = new SPSite(“http://mysharepointsite.com”))
{
using (SPWeb web = site.OpenWeb())
{
SPList taskList = web.Lists["SampleTaskList"];
SPListItem taskListItem = taskList.Items[0];
SPFieldUser assignedTo = (SPFieldUser) taskListItem.Fields[SPBuiltInFieldId.AssignedTo];
SPFieldUserValue user= (SPFieldUserValue)assignedTo.GetFieldValue(taskListItem[SPBuiltInFieldId.AssignedTo].ToString());
SPUser userObject = user.User;
}
}



Source : http://nehasinha.wordpress.com/2008/03/28/accessing-the-spuser-from-spfielduser/

mardi 4 mai 2010

MOSS 2007 - Travailler avec une liste coté client

Un client m’a demandé un script pour comptabiliser des cliques sur des vidéos. Le tout devant être fait coté client. Les données devant être stockées dans des items d’une liste SharePoint.

La solution pour laquelle j’ai opté et l’utilisation d’un Framework JavaScript/jQuery (SPAPI) me permettant de requêter facilement les WebServices SharePoint.

Vous trouverez en annexe de l’article le Framework et un lien vers ce Framework.

L’utilisation est très simple. J’ai commencé par inclure les fichiers js contenant le code dont j’ai besoin. Ensuite à l’aide d’un tutorial sur ce Framework j’ai rédigé un petit bout de code. Je mets celui-ci à titre d’exemple. C’est une modification des exemples fournis sur le tutorial.

La référence "Videos_x0020_Hits" est le static name du champ (Field) de l’item que je veux mettre à jour. L’id estl’identifiant de l’item dans la liste.

Include des fichiers :

<script type="text/javascript" src="/Ressources/scripts/SPAPI/SPAPI_Core.js"></script>
<script type="text/javascript" src="/Ressources/scripts/SPAPI/SPAPI_Lists.js"></script>
 
Code source :
//Permet de compter le nombre de click sur les videos sur la home page
//Utilise le framework javascript SPAPI
//Fichier du framework requis pour ce script :
//SPAPI_Core.js
//SPAPI_Lists.js
function UpdateVideosHits(ItemId)
{
//init
var url=""+window.location;
var urlparts =
url.split('/');

var lists = new SPAPI_Lists(urlparts[0] + '//' + urlparts[2]+'Liens vers la
sous collection de site voulue'
)

//get item : récupère la derniere valeur connu pour l'item
var items = lists.getListItems('Informations
Riches'
,'','<Query><Where><Eq><FieldRef
Name="ID" /><Value Type="Counter">'
+ItemId+'</Value></Eq></Where></Query>','<ViewFields><FieldRef Name="Videos_x0020_Hits"/></ViewFields>',1,'');

if (items.status == 200)
{
var rows = items.responseXML.getElementsByTagName('z:row');
var MyRes = rows[0].getAttribute("ows_Videos_x0020_Hits");
//Mise à jour de la valeur
var MyVal = 1;   
if(!(MyRes == null))
{
    MyVal = parseInt(MyRes);
    MyVal = MyVal + 1;
}
}
else
{
//alert('There was an error while
getting item : ' + res.statusText);
}

//update item dans la liste
var res = lists.quickUpdateListItem('Informations
Riches'
, { ID: ItemId, Videos_x0020_Hits: MyVal } );

if (res.status == 200)
{
//alert('The list item was
updated.');
}
else
{
//alert('There was an error: ' +
res.statusText);
}

}

vendredi 30 avril 2010

SPS 2010 - Activer l'intellisence Javascript pour vs.net 2010 et Sharepoint 2010



Pour l’activer il y a deux façons de faire.

Ajouter le script suivant à une page Aspx :

<asp:ScriptManagerProxy ID="ScriptManagerProxy1" runat="server">
    <Scripts>
        <asp:ScriptReference Path="~/SP.UI.Dialog.debug.js" />
    </Scripts>
</asp:ScriptManagerProxy>
<script type="text/javascript">a
.. script
</script>

Ou 3 étapes :
   1 : Ajoutez un fichier javascript
à un projet «  Ajax server control » (Qui référence System.Web.Extensions et la ressource embarqué MicrosoftAjax.js
     2 : Ajoutez les références suivantes dans le
fichier JS :


/// <reference name="MicrosoftAjax.js"/>
/// <reference path="C:\\path-to-js\\SP.UI.Dialog.debug.js"  />


  3 : Ajoutez l’équivalent du « using » en
javascript en haut du fichier JS.

- Type.registerNamespace("SP.Ribbon"); etc.

Utilisez Ctrl
+ Shift + J pour mettre à jour l’intellisence dans visual studio.

Ajoutez également la version debug, la version « non debug » est compressé pour des raisons de
performances.







jeudi 29 avril 2010

MOSS 2007 - La collection de site de la SSP est supprimée

Que faire quand on découvre que quelqu'un (peut être vous ?) à supprimé la collection de site la SSP.

Par la centrale d'administration c'est impossible, donc il reste la solution stsadm.

 stsadm.exe -o createsite -url http://<server>:<ssp_port>/ssp/admin -owneremail <email address> -ownerlogin <account> -sitetemplate OSRV#0 -title "Shared Services Administration: <your ssp name>"

L'opération peut durer longtemps.

Ensuite il faut modifier la ssp pour en tenir compte

stsadm.exe -o editssp -title "<your ssp name>" -sspadminsite http://<server>:<ssp_port>/ssp/admin

source : http://blog.glenc.net/2007/09/07/oops-i-deleted-the-ssp-admin-site-collection/

jeudi 22 avril 2010

MOSS 2007 - Suppression d'un utilisateur, de son profil et de son mySite

Exemple de suppression d'un utilisateur dont on possède le login. Avec optionnellement la suppression du MySite et du profil.
Cet exemple ne détail pas la récupération du SPweb ou du login de l'utilisateur.

using (SPSite siteCollection = ...)
{
using (SPWeb webSite = siteCollection.OpenWeb())
{
// Retrieve the ServerContext of the site collection.
ServerContext serverContext = ServerContext.GetContext(siteCollection);

// Connect to the UserProfileManager of the SharePoint Web application.
UserProfileManager userProfileManager = new UserProfileManager(serverContext);

//Remove the user old profil
if (userProfileManager.UserExists(loginName))
{
// Optionally delete the My Site of the user profile, if it exists.
UserProfile userProfile = userProfileManager.GetUserProfile(loginName);
if (userProfile.PersonalSite != null)
userProfile.PersonalSite.Delete();

// Delete the user profile.
userProfileManager.RemoveUserProfile(loginName);

}
//Delete users

webSite.SiteUsers.Remove(loginName);

}

}

Source : Perdu

jeudi 15 avril 2010

MOSS 2007 - Exemple de SpQuery Sharepoint

Les SpQuery ne sont pas spécialement compliquées, un bon exemple est largement suffisant.

using (SPWeb oWebsiteRoot = SPContext.Current.Site.RootWeb)
{
SPList oList = oWebsiteRoot.Lists["Tasks"];
SPQuery oQuery = new SPQuery();
oQuery.Query = "" +
"Completed
";

SPListItemCollection collListItems = oList.GetItems(oQuery);

    foreach (SPListItem oListItem in collListItems)
   {
      Response.Write(SPEncode.HtmlEncode(oListItem["Title"].ToString()) +
      "
");

   }

}

Source : Perdu

mercredi 14 avril 2010

MOSS 2007 - Travailler avec les groupes et les permissions dans le modèle objet SharePoint

Nous allons voir dans cet article comment créer manuellement des groupes SharePoint
et attribuer des droits à ceux-ci.

Nous partirons depuis un événement de type feature activated dans lequel on
souhaite ajouter des groupes SharePoint avec des permissions à une liste.

Enfin, en annexe la définition des rôles SharePoint (avec leur identifiant)
disponibles afin de pouvoir facilement les retrouver en cas de besoins


        public override void
FeatureActivated(SPFeatureReceiverProperties
properties)
        {
            SPWeb web = (SPWeb)properties.Feature.Parent;
            try
            {
                SPSecurity.RunWithElevatedPrivileges(delegate()                 {

                               //Ajout des groupes de sécurité

                                //Definition des roles
                                SPRoleDefinition GroupeRoleDefinition_Read = web.RoleDefinitions["Read"];
                                //Nom des groupes
                                string AdminLegalTeamGroupName = "TEST GROUPE";
                                //Ajout des groupes
                               web.SiteGroups.Add(AdminLegalTeamGroupName, web.AssociatedOwnerGroup, null, AdminLegalTeamGroupName);


                                //Récupération des groupes
                                SPGroup AdminLegalTeamGroup = web.SiteGroups[AdminLegalTeamGroupName];

                                //Association des groupes avec le spweb
                               web.AssociatedGroups.Add(AdminLegalTeamGroup);
                                //Assignation des rôles
                                SPRoleAssignment Group2RoleAssigment_AdminLegalTeam = new SPRoleAssignment(AdminLegalTeamGroup);
Group2RoleAssigment_AdminLegalTeam.RoleDefinitionBindings.Add(GroupeRoleDefinition_Read);

                                //Assignation au spweb
                               web.RoleAssignments.Add(Group2RoleAssigment_AdminLegalTeam);
                                //Mise à jour
                                web.Update();

//Ajout des sous répertoires avec les droits adaptés
SPList docLib = web.Lists["My library"];


foreach (SPFolder fold in docLib.RootFolder.SubFolders)  {


     if (fold.Name == "My root folder")
      {
newFolder = fold.SubFolders.Add("My sub Folder ..."); 
newFolder.Item.BreakRoleInheritance(false);
newFolder.Item.RoleAssignments.Add(Group2RoleAssigment_AdminLegalTeam);     
newFolder.Item.Update();                                 
       }
  }
  //Mise à jour

   web.Update();

}}}


Enfin le
code xml des rôles disponibles




<Roles>





<Role ID="1073741829" Name="Full
Control" Description="Has full control." Order="1"
Hidden="False" Type="Administrator" BasePermissions="FullMask"
/>





<Role ID="1073741828"
Name="Design" Description="Can view, add, update, delete,
approve, and customize." Order="2" Hidden="False"
Type="WebDesigner" BasePermissions="ViewListItems, AddListItems,
EditListItems, DeleteListItems, ApproveItems, OpenItems, ViewVersions,
DeleteVersions, CancelCheckout, ManagePersonalViews, ManageLists,
ViewFormPages, Open, ViewPages, AddAndCustomizePages, ApplyThemeAndBorder,
ApplyStyleSheets, CreateSSCSite, BrowseDirectories, BrowseUserInfo, AddDelPrivateWebParts,
UpdatePersonalWebParts, UseClientIntegration, UseRemoteAPIs, CreateAlerts,
EditMyUserInfo" />





<Role ID="1073741925" Name="Manage
Hierarchy" Description="Can create sites and edit pages, list items,
and documents." Order="3" Hidden="False" Type="None"
BasePermissions="ViewListItems, AddListItems, EditListItems,
DeleteListItems, OpenItems, ViewVersions, DeleteVersions, CancelCheckout,
ManagePersonalViews, ManageLists, ViewFormPages, Open, ViewPages,
AddAndCustomizePages, ViewUsageData, CreateSSCSite, ManageSubwebs,
ManagePermissions, BrowseDirectories, BrowseUserInfo, AddDelPrivateWebParts,
UpdatePersonalWebParts, ManageWeb, UseClientIntegration, UseRemoteAPIs,
ManageAlerts, CreateAlerts, EditMyUserInfo, EnumeratePermissions" />





<Role ID="1073741924"
Name="Approve" Description="Can edit and approve pages, list
items, and documents." Order="4" Hidden="False"
Type="None" BasePermissions="ViewListItems, AddListItems,
EditListItems, DeleteListItems, ApproveItems, OpenItems, ViewVersions,
DeleteVersions, CancelCheckout, ManagePersonalViews, ViewFormPages, Open,
ViewPages, CreateSSCSite, BrowseDirectories, BrowseUserInfo,
AddDelPrivateWebParts, UpdatePersonalWebParts, UseClientIntegration,
UseRemoteAPIs, CreateAlerts, EditMyUserInfo" />




<Role ID="1073741827"
Name="Contribute" Description="Can view, add, update, and
delete." Order="5" Hidden="False"
Type="Contributor" BasePermissions="ViewListItems, AddListItems,
EditListItems, DeleteListItems, OpenItems, ViewVersions, DeleteVersions,
ManagePersonalViews, ViewFormPages, Open, ViewPages, CreateSSCSite,
BrowseDirectories, BrowseUserInfo, AddDelPrivateWebParts,
UpdatePersonalWebParts, UseClientIntegration, UseRemoteAPIs, CreateAlerts,
EditMyUserInfo" />





<Role ID="1073741826"
Name="Read" Description="Can view only."
Order="6" Hidden="False" Type="Reader"
BasePermissions="ViewListItems, OpenItems, ViewVersions, ViewFormPages,
Open, ViewPages, CreateSSCSite, BrowseUserInfo, UseClientIntegration,
UseRemoteAPIs, CreateAlerts" />





<Role ID="1073741926" Name="Restricted
Read" Description="Can view pages and documents, but cannot view
historical versions or review user rights information."
Order="7" Hidden="False" Type="None"
BasePermissions="ViewListItems, OpenItems, Open, ViewPages" />





<Role ID="1073741825" Name="Limited
Access" Description="Can view specific lists, document libraries,
list items, folders, or documents when given permissions."
Order="8" Hidden="True" Type="Guest"
BasePermissions="Open, BrowseUserInfo, UseClientIntegration" />





<Role ID="1073741927" Name="View
Only" Description="Members of this group can view pages, list items,
and documents. If the document has a server-side file handler available, they
can only view the document using the server-side file handler." Order="2147483647"
Hidden="False" Type="None"
BasePermissions="ViewListItems, ViewVersions, ViewFormPages, Open,
ViewPages, CreateSSCSite, BrowseUserInfo, UseClientIntegration, UseRemoteAPIs,
CreateAlerts" />





</Roles>





Source :





mardi 13 avril 2010

MOSS 2007 - stsadm - Rappel : Deploiement de Wsp

Parceque c'est tellement simple qu'on l'oublie parfois... Parceque une faute de frappe est vite arrivé...

voici un exemple de deploiement de WSP

cd "C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\BIN"


stsadm -o addsolution -filename c:\MyPackage.wsp

stsadm -o execadmsvcjobs

stsadm -o deploysolution -name MyPackage.wsp -immediate -allcontenturls -allowGacDeployment -allowCasPolicies

stsadm -o execadmsvcjobs

source : http://msdn.microsoft.com/en-us/library/aa544500.aspx

MOSS 2007 - Ajout de videos dans Sharepoint

Rien de plus simple, ajoutez une "content editor web part" et ajoutez le code suivant :

<embed allowfullscreen="true" autostart="false" height="350" loop="false" quality="high" src="{URL of video / Shared Path pointing to video file}" type="text/html; charset=UTF-8" width="350">
</embed>
 
Voilà le résultat



source :
 http://www.sharepointkings.com/2010/01/how-to-embed-video-in-sharepoint.html
 http://blogs.codes-sources.com/fabrice69/archive/2008/01/10/sharepoint-embarquer-de-la-vid-o-dans-une-page-wss-v3.aspx

jeudi 1 avril 2010

Asp.net 3.5 - Rejoindre une ancre en code behind

Un petit exemple de code qui permet de rejoindre une ancre en code behind. Ne pas oublier de donner un Id à l'ancre en plus du tradionnel "name".
 
Page.ClientScript.RegisterStartupScript(this.GetType(), "navigate", string.Format("document.getElementById('{0}').scrollIntoView();", "MonAncreId"), true);

Asp.net 3.5 - Server Transfer et StackOverFlow

Aujourd’hui quelque chose d’un peu plus light que les derniers articles : les boucles infinies liées au Server.Transfert.
En effet, si l’on utilise Server.Transfer dans un Event de type Click(et que l'on transfère l'event click), alors  on obtient une StackOverFlow. (L'event click, appel un transfert qui appel un click qui....)

Le petit code suivant permet de l’éviter.
        if (IsPostBack)
        {
            if (Context.Items["Transferred"] == null)
            {
                // Initialize to prevent stackover
                Context.Items["Transferred"] = new object();
                // TransferToSelf
                Server.Transfer("Webform1.aspx", true);
            }
        }

Asp.net 3.5 - Custom control dynamique, PostBack et ViewState

Un exemple est toujours mieux qu’un long discours, ci dessous une page asp.net faisant l’affichage dynamique de custom contrôle en fonction du type de données récupéré.
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="EditDashBoard.aspx.cs" Inherits="Admin_Dashboard_EditDashBoard" %>
<%@ Register TagPrefix="uc1" TagName="uCtrlTitle" Src="../../Include/UserControls/uCtrlTitle.ascx" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <META HTTP-EQUIV="Pragma" CONTENT="no-cache" />
    <META HTTP-EQUIV="Expires" CONTENT="-1" />
    <title>EditDashboard</title>
    <link href="../../Css/standard/standard.css" type="text/css" rel="stylesheet" />
</head>
<body>
    <form id="form1" runat="server">
    <div style="text-align:center;margin-top:10px" align="center">
            <table align="center" width="95%" border="0">
              <tr>
                    <td align="center"><uc1:uctrltitle id="UCtrlTitle1" runat="server"></uc1:uctrltitle></td>
              </tr>
        </table>
    </div>
    <div style="text-align:center;margin-top:10px" align="center">
        <asp:Panel id="Panelcontent" runat="server">
         
        </asp:Panel>
    </div>   
    </form>
</body>
</html>
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using MonProjet.Business.DashBoard;
using MonProjet.DAL.Objects;
using MonProjet.DAL.DatasContexts.DashBoard;
using MonProjetV2.Include.Controls.Dashboard;
 
/// <summary>
/// Page d'édition de control panel
/// </summary>
public partial class Admin_Dashboard_EditDashBoard : BasePage
{
    /// <summary>
    /// Liste servant a recréer des controles dynamiques
    /// </summary>
    List<DynamicControlForViewState> DynamicControls
    {
        get
        {
            if (ViewState["DynamicControls"] == null)
            {
                ViewState["DynamicControls"] = new List<DynamicControlForViewState>();
            }
            return (List<DynamicControlForViewState>)ViewState["DynamicControls"];
        }
        set
        {
            ViewState["DynamicControls"] = value;
        }
    }
 
 
    /// <summary>
    /// Chargement de la page, récupération de l'id du dashboard à éditer
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void Page_Load(object sender, EventArgs e)
    {
 
        Translation();
 
        if (!Page.IsPostBack)
        {
            if (PreviousPage != null)
            {
                try
                {
                    //Récupération de l'id du control panel
                    int l_DashBoardId = -1;
                    string l_Tmp = ((HiddenField)Page.PreviousPage.Controls[0].FindControl("Hd_DashBoardId")).Value;
                    if (!int.TryParse(l_Tmp, out l_DashBoardId))
                    {
                        //TODO error
                        Response.Write("ERROR");
                    }
                    else
                    {
                        if (l_DashBoardId > 0)
                        {
                            //TODO affichage
                            LoadControls(l_DashBoardId, GetLanguageId());
                            return;
                        }
                        else
                        {
                            //TODO error
                            Response.Write("ERROR");
                        }
                    }
                }
                catch
                {
                    //TODO error
                    Response.Write("ERROR");
                }
 
            }
        }
        else {
            ReLoadDynamicControls();
        }
     
 
    }
 
    #region private
 
    /// <summary>
    /// Traduction
    /// </summary>
    private void Translation()
    {
        UCtrlTitle1.SetTitle(Translate("EDITDASHBOARD"));
 
    }
 
 
    /// <summary>
    /// Rechargement des controls apres un postback par exemple
    /// </summary>
    private void ReLoadDynamicControls()
    {
        foreach (DynamicControlForViewState val in DynamicControls)
        {
            //Création des parties à afficher en fonction de leur type
            //NB : Ne pas oublier de rattacher les Events si besoins.
            switch (val.ControlType)
            {
                case 1: //Cokpit Main part
                    var CockpitPart = new DashBoardMainPart();
                    CockpitPart.ID = val.ControlId;
                    Panelcontent.Controls.Add(CockpitPart);
                    break;
                case 2: //Detail Main part
                    var DetailPart = new DashBoardMainPart();
                    DetailPart.ID = val.ControlId;
                    Panelcontent.Controls.Add(DetailPart);
                    break;
                case 3: //Titre
                    var TitrePart = new DashBoardtitle();
                    TitrePart.ID = val.ControlId;
                    Panelcontent.Controls.Add(TitrePart);
                    break;
                case 4: //Section
                    var SectionPart = new DashBoardMainPart();
                    SectionPart.ID = val.ControlId;
                    Panelcontent.Controls.Add(SectionPart);
                    break;
                default: //Default part
                    var DefaultPart = new DashBoardMainPart();
                    DefaultPart.ID = val.ControlId;
                    Panelcontent.Controls.Add(DefaultPart);
                    break;
            }
        }
    }
 
    /// <summary>
    /// Charge les controles depuis une liste
    /// </summary>
    /// <param name="l_Res"></param>
    private void LoadControlsFromList(List<DashBoardLine> l_Res)
    {
        List<DynamicControlForViewState> l_ControlList = new List<DynamicControlForViewState>();
        foreach (DashBoardLine val in l_Res)
        {
            //Création des parties à afficher en fonction de leur type
            switch (val.TypCtrlPanelLgn_Id)
            {
                case 1: //Cokpit Main part
                    var CockpitPart = new DashBoardMainPart();
                    CockpitPart.ID = string.Format("{0}{1}","CockpitPart",val.CtrPanelLgn_Id.ToString());
                    CockpitPart.Text = val.CtrPanelLgnTrans_Label;
                    CockpitPart.LigneId = val.CtrPanelLgn_Id;
                    CockpitPart.DashBoardId = val.CtrlPanel_Id;
                    Panelcontent.Controls.Add(CockpitPart);
                    l_ControlList.Add(new DynamicControlForViewState(1, CockpitPart.ID));
                    break;
                case 2: //Detail Main part
                    var DetailPart = new DashBoardMainPart();
                    DetailPart.ID = string.Format("{0}{1}", "DetailPart", val.CtrPanelLgn_Id.ToString());
                    DetailPart.Text = val.CtrPanelLgnTrans_Label;
                    DetailPart.LigneId = val.CtrPanelLgn_Id;
                    DetailPart.DashBoardId = val.CtrlPanel_Id;
                    Panelcontent.Controls.Add(DetailPart);
                    l_ControlList.Add(new DynamicControlForViewState(2, DetailPart.ID));
                    break;
                case 3: //Titre
                    var TitrePart = new DashBoardtitle();
                    TitrePart.ID = string.Format("{0}{1}", "TitrePart", val.CtrPanelLgn_Id.ToString());
                    TitrePart.Text = val.CtrPanelLgnTrans_Label;
                    Panelcontent.Controls.Add(TitrePart);
                    l_ControlList.Add(new DynamicControlForViewState(3, TitrePart.ID));
                    break;
                case 4: //Section
                    var SectionPart = new DashBoardMainPart();
                    SectionPart.ID = string.Format("{0}{1}", "SectionPart", val.CtrPanelLgn_Id.ToString());
                    SectionPart.Text = val.CtrPanelLgnTrans_Label;
                    Panelcontent.Controls.Add(SectionPart);
                    l_ControlList.Add(new DynamicControlForViewState(4, SectionPart.ID));
                    break;
                default: //Default part
                    var DefaultPart = new DashBoardMainPart();
                    DefaultPart.ID = string.Format("{0}{1}", "DefaultPart", val.CtrPanelLgn_Id.ToString());
                    DefaultPart.Text = val.CtrPanelLgnTrans_Label;
                    Panelcontent.Controls.Add(DefaultPart);
                    l_ControlList.Add(new DynamicControlForViewState(1, DefaultPart.ID));
                    break;
            }
 
        }
        //Svg dans le viewstate la liste des controles de la page
        //On ne sauvegarde que le type, le contenu des controles est conservé par le viewstate de ses controles enfants
        DynamicControls = l_ControlList;
    }
 
    /// <summary>
    /// Chargement des lignes
    /// </summary>
    /// <param name="DashBoardId">Id du dashboard</param>
    /// <param name="LangueId">Langue devant être chargé</param>
    private void LoadControls(int DashBoardId, int LangueId)
    {
        var L_LstLines = Dashboard.Get_DashBoardLines(DashBoardId, LangueId);
        LoadControlsFromList(L_LstLines);
      
    }
   
 
    #endregion
}
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
 
/// <summary>
/// Objet permettant de Sauvegarder l'id et le type d'un control,
/// utilisé par exemple dans des listes de controles dynamique stockées en viewstate
/// </summary>
[Serializable]
public class DynamicControlForViewState
{
    public int ControlType { get; set; }
    public string ControlId { get; set; }
 
    public DynamicControlForViewState()
    {
 
    }
 
    public DynamicControlForViewState(int NType,String NId)
    {
        ControlId = NId;
        ControlType = NType;
    }
}
 
using System;
using System.ComponentModel;
using System.Security.Permissions;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
 
 
namespace MonProjetV2.Include.Controls.Dashboard
{
   
    /// <summary>
    /// Control utlisé dans le dashboard pour affiché les titres de grandes parties
    /// </summary>  
    public class DashBoardMainPart : WebControl, IPostBackEventHandler
    {
        /// <summary>
        /// Constructeur, maintient également les controles
        /// </summary>
        public DashBoardMainPart()
            : base()
        {
            //Maintient le contenu des controls
            this.EnsureChildControls();
        }
 
        #region properties
 
        /// <summary>
        /// Nom utilisé à la génération des Id des controles enfants
        /// </summary>
        private string ControlDisplayTypeName = "DashBoardMainPartControl";
 
        /// <summary>
        /// Image button permettant d'ajouter un titre
        /// </summary>
        protected ImageButton AddTitleButton = new ImageButton();
 
        /// <summary>
        /// Text principal affiché dans l'encadré
        /// </summary>
        protected Literal MainText = new Literal();
 
        /// <summary>
        /// Conserve le contenue du MainText à travers les postback
        /// </summary>
        protected HiddenField HDMainTextValue = new HiddenField();
 
        /// <summary>
        /// Champs caché permettant de maintenir le numéro de ligne
        /// </summary>
        protected HiddenField HDLigneId = new HiddenField();
 
        /// <summary>
        /// Champs caché permettant de maintenir le numéro de dashboard
        /// </summary>
        protected HiddenField HDDashBoardId = new HiddenField();
 
 
        /// <summary>
        /// Control de test pour vérifier que le viewstate d'un contrôle est bien conservé après un postback
        /// </summary>
        protected TextBox TxtTest  = new TextBox();
 
 
        [      
        Description("Le texte affiché dans l'encadré principal"),
        DefaultValue(""),
        Localizable(true)
        ]
        public string Text
        {
 
            get {
                if (string.IsNullOrEmpty(MainText.Text))
                    if (!string.IsNullOrEmpty(HDMainTextValue.Value))
                        MainText.Text = HDMainTextValue.Value;
                    else
                        MainText.Text = string.Empty;
                return this.MainText.Text;
            }
            set {
                HDMainTextValue.Value = value;
                this.MainText.Text = value;
            }
        }
 
 
        [
        Description("Identifiant de la ligne"),
        DefaultValue(-1),
        Localizable(true)
        ]
        public int LigneId
        {
 
            get
            {
                string s = HDLigneId.Value;
                if (!string.IsNullOrEmpty(s))
                {
                    int OutResult;
                    if (int.TryParse(s, out OutResult))
                        return OutResult;
                    else
                        return 0;
                }
                else
                    return 0;
            }
            set
            {
                this.HDLigneId.Value = value.ToString();
            }
        }
 
        [
        Description("Identifiant du DashBoard"),
        DefaultValue(-1),
        Localizable(true)
        ]
        public int DashBoardId
        {
            get
            {
                string s = HDDashBoardId.Value;
                if (!string.IsNullOrEmpty(s))
                {
                    int OutResult;
                    if (int.TryParse(s, out OutResult))
                        return OutResult;
                    else
                        return 0;
                }
                else
                    return 0;
            }
            set
            {
                this.HDDashBoardId.Value = value.ToString();
            }
        }
 
        #endregion
 
        #region Gestion des controles enfants
        /// <summary>
        /// Ajout des controles enfants à la collection du custom control,
        /// permet de maintenir le control apres un postback(Viewstates etc.etc.)
        /// </summary>
        protected override void CreateChildControls()
        {
            //Init
            AddTitleButton.ImageUrl = ResolveUrl("~/Images/icons/icon_add.gif");
 
            //AddControls     
            this.Controls.Add(AddTitleButton);
            this.Controls.Add(MainText);
            this.Controls.Add(HDLigneId);
            this.Controls.Add(HDDashBoardId);
            this.Controls.Add(HDMainTextValue);
 
          
        }
        #endregion
 
        #region EventsHandler
 
        /// <summary>
        /// EventHandler déclenché à l'ajout d'un titre
        /// </summary>
        public event EventHandler CreateTitle;
 
        /// <summary>
        /// Evenement déclenché par le click de l'ajout de titre
        /// </summary>
        /// <param name="Sender"></param>
        /// <param name="e"></param>
        protected virtual void AddTitleButton_Click(object Sender, EventArgs e)
        {
            //Si des méthodes sont abonnées alors on déclenche l'événement
            if (CreateTitle != null)
            {
                CreateTitle(this, e);
            } 
            //Traitement systematique
            HttpContext.Current.Response.Write("POSTBACK ADD TITLE!!!! de "+this.ID.ToString()+" valeur post : "+TxtTest.Text );
          
        }
 
        // Remonté du posteBack, gestion manuel
        public void RaisePostBackEvent(string eventArgument)
        {
            AddTitleButton_Click(this,new EventArgs());
        }
 
       
        /// <summary>
        /// Ajout des références de postback sur les controles concernés
        /// </summary>
        /// <param name="writer"></param>
        private void AddPostBackReference(HtmlTextWriter writer)
        {
            //L'ajout de return false permet d'empecher le postback de formulaire au profit de notre postback
            writer.AddAttribute(HtmlTextWriterAttribute.Onclick,
                   Page.ClientScript.GetPostBackEventReference(this, "CreateTitle")+";return false;");
            AddTitleButton.Attributes.AddAttributes(writer);
           
 
        }
        #endregion
        /// <summary>
        /// Gestion du rendu graphique du control
        /// </summary>
        /// <param name="writer"></param>
        protected override void RenderContents(HtmlTextWriter writer)
        {
 
            //Render
            if (Visible)
            {
                //Postback, gestion manuel des liaisons
                AddPostBackReference(writer);
 
                //Init des valeurs
                MainText.Text = Text;
 
                //Header
                writer.Write(@"           
            <!-- Control DashBoardMainPart-->
            <div style='text-align:center;margin-top:10px' align='center'>
            <LINK href='" + ResolveUrl("~/Css/standard/standard.css") + @"' type='text/css' rel='stylesheet'>
            ");
                //Bandeaux
                writer.Write(@"           
            <TABLE id='tblzTitre' cellSpacing='0' cellPadding='0' width='95%' align='center' border='0'>
                  <TR>
                        <TD><table width='100%' class='cTblTitle'>
                                    <tr>
                                          <td align='center' valign='middle'>
                                        <B>");
                MainText.RenderControl(writer);
                writer.Write(@"</B>
                                          </td>
                                    </tr>
                              </table>
                        </TD>
                        <TD class='cLngBorderRightS1' width='3'></TD>
                  </TR>
                  <TR>
                        <TD class='cLngBorderBottomS1' colSpan='2' height='3' width='100%'></TD>
                  </TR>
            </TABLE>
            ");
                //Rendu des controles enfants
                writer.Write("<div style='text-align:right;margin-top:10px' align='right'>");
                AddTitleButton.RenderControl(writer);
                writer.Write("</div>");
 
                TxtTest.RenderControl(writer);
                HDMainTextValue.RenderControl(writer);
                HDLigneId.RenderControl(writer);
                HDDashBoardId.RenderControl(writer);
                //Footer
                writer.Write(@"
            </div>
            <!-- / Control DashBoardMainPart -->
            ");
            }
 
        }
    }
}