Overblog
Suivre ce blog Administration + Créer mon blog
26 octobre 2009 1 26 /10 /octobre /2009 10:11

Indiquer que la valeur Width ou Height d’un control doit être “Auto” est très facile en passant par la fenêtre de propriétés ou par le code XAML. Il suffit de mettre Width=”Auto”.

Mais dans le code “behind” les choses sont beaucoup moins évidentes car la propriété Width attend une valeur Double et non pas une chaîne de caractères comme “Auto”.

 

Pour indiquer dans le code qu’une valeur est “Auto” il faut donc procéder comme ceci :

 

Code :

uc.Width = Double.NaN
uc.Height = Double.NaN

Le plus drôle c’est que NaN veut dire “Not a Number” !!! Avouez qu’ils ont de l’humour chez Microsoft.  A quand le str=String.NaS ?? :p

Partager cet article
Repost0
9 octobre 2009 5 09 /10 /octobre /2009 13:45

Si il était déjà possible de choisir depuis Windows XP de fonctionner en 64 bits au lieu de 32, beaucoup se demande si la sortie de Windows 7 n’est pas l’occasion de passer au 64 bits.

 

A la différence de Windows XP et Windows Vista, vous n’avez pas besoin de choisir la version 32 ou 64 bits de Windows 7 au moment de l’achat. En effet, Windows 7 vous sera livré à la fois en 32 et en 64 bits (Sauf pour la version OEM réservé aux professionnels). Si vous achetez un ordinateur déjà équipé de Windows 7 (Version OEM préinstallé par le fabricant), vérifiez bien si il est en 32 ou 64 bits car vous n’aurez pas la possibilité de changer, à moins d’acheter par la suite une autre versions de Windows 7.

 

Si vous prévoyez de faire une mise à jour de Windows XP ou Vista vers Windows 7 au lieu d’une nouvelle installation, vous ne pourrez pas mettre à jour en 64 bits si votre système est déjà installé en 32bits et vice versa.

 

Quel différence entre 32 et 64 bits ?

Passer en 64 bits veut simplement dire qu’une plus grande quantité de données sera échangée entre les logiciels et la mémoire en une seule fois, l’objectif étant de gagner en rapidité. Mais ceci n’est vrai que si le logiciel prend en charge le 64 bits. Néanmoins les logiciels ne prenant en charge que le 32 bits fonctionneront parfaitement sur un système en 64 bits. Attention, ceci n’est pas vrai pour ce qui est des pilotes de vos périphériques qui doivent impérativement être en 64 bits.

Certaines barrettes mémoires ne fonctionnent que sur des systèmes 64 bits alors que d’autres fonctionnent indifféremment sur les 2 systèmes. Vérifiez bien avant d’acheter vos barrettes.

 

Quelle configuration minimum pour un 64 bits ? 

Un processeur double cœur et au moins 4 Go de mémoire. Ne pas négliger non plus la mémoire cache du processeur. Plus elle est grande, mieux c’est.

 

Quel est le risque de passer en 64 bits ?

Le plus grand risque est de ne pas pouvoir trouver de pilotes 64 bits pour vos vieux périphériques. Je vous conseille donc avant de passer en 64 bits de vérifier si les constructeurs de vos périphériques ont bien prévu une version 64 bits de leurs pilotes.

Certains vieux logiciels peuvent également refuser de fonctionner sur un système en 64 bits.

 

Faut-il passer au 64 bits ou est-il préférable d’attendre encore ?

Ma réponse est OUI il faut passer au 64 bits car c’est l’avenir et les systèmes 32 bits sont voués à disparaitre. Windows 7 est une excellente occasion de le faire.

Partager cet article
Repost0
12 septembre 2009 6 12 /09 /septembre /2009 09:49

Le code généré par le site PayPal pour les boutons ressemble à ceci :

 

Code du bouton “Afficher le panier”. (La partie crypté a été tronqué et remplacé par … )

<form target="paypal" action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_s-xclick">
<input type="hidden" name="encrypted" value="-----BEGIN PKCS7----- … -----END PKCS7-----">
<input type="image" src="https://www.paypal.com/fr_FR/FR/i/btn/btn_viewcart_LG.gif" border="0" name="submit" alt="PayPal - la solution de paiement en ligne la plus simple et la plus sécurisée !">
<img alt="" border="0" src="https://www.paypal.com/fr_FR/i/scr/pixel.gif" width="1" height="1">
</form>

Si nous mettons ce code directement sur une page ASP.NET on a de forte chance que rien ne se passe lorsque l’on clique sur le bouton.

Pour résoudre ce problème nous allons créer une classe qui va nous permettre de générer dynamiquement le form que nous allons envoyer à PayPal.

 

Code :

Public Class RemotePost

    Private Inputs As System.Collections.Specialized.NameValueCollection = New System.Collections.Specialized.NameValueCollection()

    Private _Url As String = String.Empty
    Private _Method As String = "post"
    Private _FormName As String = "form1"

    Public Sub Add(ByVal name As String, ByVal value As String)
        Inputs.Add(name, value)
    End Sub

    Public Sub Post()
        System.Web.HttpContext.Current.Response.Clear()

        System.Web.HttpContext.Current.Response.Write("<html><head>")

        System.Web.HttpContext.Current.Response.Write(String.Format("</head><body onload=document.{0}.submit()>", FormName))

        System.Web.HttpContext.Current.Response.Write(String.Format("<form name='{0}' method='{1}' action='{2}' >", FormName, Method, Url))
        For i As Integer = 0 To Inputs.Keys.Count - 1
            System.Web.HttpContext.Current.Response.Write(String.Format("<input name='{0}' type='hidden' value='{1}'>", Inputs.Keys(i), Inputs(Inputs.Keys(i))))

        Next
        System.Web.HttpContext.Current.Response.Write("</form>")
        System.Web.HttpContext.Current.Response.Write("</body></html>")
        System.Web.HttpContext.Current.Response.End()
    End Sub

    Property FormName() As String
        Get
            Return _FormName
        End Get
        Set(ByVal value As String)
            _FormName = value
        End Set
    End Property

    Property Method() As String
        Get
            Return _Method
        End Get
        Set(ByVal value As String)
            _Method = value
        End Set
    End Property

    Property Url() As String
        Get
            Return _Url
        End Get
        Set(ByVal value As String)
            _Url = value
        End Set
    End Property
End Class

 

Ensuite il suffit de créer votre propre bouton et d’utiliser votre classe RemotPost dans l’événement click du bouton.

 

Code :

Protected Sub ImageButtonPanier_Click(ByVal sender As Object, ByVal e As System.Web.UI.ImageClickEventArgs) Handles ImageButtonPanier.Click
        Dim remote As New RemotePost
        remote.Url = "https://www.paypal.com/cgi-bin/webscr"
        remote.Add("cmd", "_s-xclick")
        remote.Add("encrypted", "-----BEGIN PKCS7----- … -----END PKCS7-----")
        remote.Post()
End Sub

 

La classe RemotPost peut être utilisée pour tous les autres boutons PayPal.

Partager cet article
Repost0
7 août 2009 5 07 /08 /août /2009 09:26

Pour mettre un FCKEditor dans un update panel sans obtenir d’erreur lors d’un postBack vous devez mettre le code suivant dans votre page.

 

Code :

 

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

       Me.ClientScript.RegisterOnSubmitStatement(Me.GetType, "AjaxHack", "for ( var i = 0; i < parent.frames.length; ++i ) if ( parent.frames[i].FCK) parent.frames[i].FCK.UpdateLinkedField();")

End Sub

N’oubliez pas de remplacer FCK par le nom de votre FCKEditor

Partager cet article
Repost0
20 juillet 2009 1 20 /07 /juillet /2009 11:19

 

Prenons pour exemple la chaîne de caractères suivante ayant des balises de formatage :

Code :

<p><span style="font-size: large">HELLO</span></p>

 

Pour obtenir uniquement le texte HELLO nous allons utiliser la fonction suivante :

 

Code :

Public Function HTMLParser(ByVal str As String) As String
        Return Regex.Replace(str, "(<[^>]+>)", " ")
End Function

Partager cet article
Repost0
20 juillet 2009 1 20 /07 /juillet /2009 08:17

Voici une fonction qui va vous permettre d’obtenir le chemin virtuel à partir du chemin physique :

Code :

Public Function GetVirtualPath(ByVal physicalPath As String) As String

       Dim rootpath As String = Server.MapPath("~/")
       physicalPath = physicalPath.Replace(rootpath, "")
       physicalPath = physicalPath.Replace("\\", "/")
       physicalPath = physicalPath.Replace("\", "/")
       Return "~/" & physicalPath
   End Function

Partager cet article
Repost0
30 juin 2009 2 30 /06 /juin /2009 17:30

L’utilisateur a souvent tendance à cliquer plusieurs fois sur le bouton de validation d’un formulaire, pensant que le premier clique n’a pas été pris en compte.

Par exemple, dans le cas d’un formulaire envoyant un email, il en résulte plusieurs envoies du même email.

Pour éviter ce désagrément et informer l’utilisateur que son premier clique a bien été pris en compte nous allons ajouter un peu de JavaScript dans notre code.

Dans cette exemple l’ID du bouton est “ButtonEnvoyer”. Vous devez remplacer cette ID par l’ID de votre bouton.

 

Voici notre bouton :

Code :

<asp:Button  id="ButtonEnvoyer" runat="server" Text="Envoyer" Width="125px" />

 

Et voici le code behind qui permet d’ajouter le JavaScript.

Code :

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        Dim sbValid As System.Text.StringBuilder = New System.Text.StringBuilder

        sbValid.Append("if (typeof(Page_ClientValidate) == 'function') { ")

        sbValid.Append("if (Page_ClientValidate() == false) { return false; }} ")

        sbValid.Append("this.value = 'Patientez svp...';")

        sbValid.Append("this.disabled = true;")

        sbValid.Append(ClientScript.GetPostBackEventReference(Me.ButtonEnvoyer, Nothing).ToString)

        sbValid.Append(";")

        ButtonEnvoyer.Attributes.Add("onclick", sbValid.ToString())

 

End Sub

 

Si le formulaire n’est pas valide le bouton est Enabled=True et affiche le texte “Envoyer”.

Si le formulaire est valide le bouton est Enabled=False et affiche “Patientez svp…”

Ce bouton peut être mis dans un UpdatePanel.

Partager cet article
Repost0
26 juin 2009 5 26 /06 /juin /2009 10:41

Voici la configuration du  Membership provider se trouvant dans le Web.config :

 

Code :

<membership>
            <providers>
                <remove name="AspNetSqlMembershipProvider"/>
                <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="myConnectionString" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" applicationName="/" requiresUniqueEmail="true" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordFormat="Hashed" maxInvalidPasswordAttempts="100" passwordAttemptWindow="10" passwordStrengthRegularExpression=""/>
            </providers>
        </membership>

 

D’après cette configuration, le mot de passe doit être de 6 caractères minimum et il est “Hashed” ce qui veut dire que l’on ne peut pas retrouver le mot de passe de l’utilisateur dans la base de données.

Si on utilise directement MembershipUser.ResetPassord, la méthode va générer un mot de passe qui est généralement très compliqué. La solution serait de Override la méthode, mais créer une nouvelle classe qui hérite de MemberShipUser juste pour Override une méthode c’est un peu lourd.

 

Voici comment procéder pour faire plus simple.

Tout d’abord nous allons créer une méthode qui va nous retourner le MemberShipUser à partir du nom de l’utilisateur.

Code :

Public Function GetMembershipUser(ByVal userName As String) As MembershipUser
        Dim mu As MembershipUser
        If userName = Nothing Then
            mu = Membership.GetUser()
        Else
            mu = Membership.GetUser(userName)
        End If
        Return mu
    End Function

Ensuite nous allons créer une méthode qui va générer notre nouveau mot de passe.

Code :

Public Function GenPassword(ByVal lenght As Integer) As String
        Dim strAlphaNum As String()
        Dim password As New StringBuilder
        Dim rnd As New Random
        strAlphaNum = New String(58) {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "1", "2", "3", "4", "5", "6", "7", "8", "9"}
        For iAlpha As Integer = 1 To lenght
            password.Append(strAlphaNum(rnd.Next(58)))
        Next
        Return password.ToString
    End Function

Vous remarquerez que la lettre O et le chiffre 0 ne seront pas utilisés car trop souvent confondu par les utilisateurs.

 

Et enfin nous allons créer notre propre méthode ResetUserPassword.

Code :

Public Function ResetUserPassword(ByVal userName As String) As String
        Dim mu As MembershipUser = GetMembershipUser(userName)
        Dim oldPassword As String = mu.ResetPassword
        Dim newPassword As String = GenPassword(Membership.MinRequiredPasswordLength)
        mu.ChangePassword(oldPassword, newPassword)
        Return newPassword
    End Function

L’astuce est simple. On utilise MembershipUser .ResetPassword qui va nous retourner un nouveau mot de passe, puis on utilise MembershipUser.ChangePassword pour modifier à nouveau le mot de passe, mais cette fois ci, en utilisant notre propre méthode GenPassword.

Partager cet article
Repost0
19 juin 2009 5 19 /06 /juin /2009 10:07

Vous pouvez forcer IE8 à se comporter comme IE7 en ajoutant un meta tag entres les balises <head> de votre page ou de votre MasterPage.

Ceci peut résoudre des problèmes de compatibilité avec IE8, qui sont courant, en particulier pour l’affichage des menus.

 

Code :

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />

Partager cet article
Repost0
18 juin 2009 4 18 /06 /juin /2009 09:59

Pour réaliser facilement un pied de page dans une MasterPage il vous faut 2 <div>. Le premier contiendra le contenue de la page et devra avoir un min-height de 100%. Le deuxième contiendra votre pied de page et devra avoir une position absolute et un bottom de 0 pixels.

Code :

<div id="nonfooter" style="min-height:100%;font-size: large; height: 100%;" align="left">
        <asp:ContentPlaceHolder id="ContentPlaceHolder1" runat="server">
        </asp:ContentPlaceHolder>
</div>


    <div id="footer"
        style="width: 100%;position:fixed;bottom:0px;background-color: #7B0C00; font-family: verdana; color: #FFFFFF; font-size: xx-small;">
        Conception
        <asp:HyperLink ID="HyperLink1" runat="server" ForeColor="White"
            NavigateUrl="http://www.cyrilhome.com">Cyril Hennebique</asp:HyperLink>
    </div>

Partager cet article
Repost0