Acceder aux propriétés du profile via un expressionbuilder personnalisé

Description

ASP.net 2.0 permet de se servir des dynamics expressions dans notre code ASP.net .aspx, les dynamic expressions sont les <%$ AppSettings : mykey %> que l'on peut aussi appeller $-expression. Cet exemple montre comment créer nos propres $-expressions pour lire facilement les propriété contenu dans le Profile de l'utilisateur.

Pour l'utiliser il suffit de mettre la classe ci-dessus dans le dossier App_Code enregistrer l'expression dans le web.config :

<compilation>
<expressionBuilders>
<add expressionPrefix="Profile" type="ProfileExpressionBuilder"/>
</expressionBuilders>
</compilation>

vous pouvez alors utiliser l'expression de cette façon :

<asp:Label ID="lbl1" runat="server" Text="<%$ Profile:City %>"></asp:Label>

Ce code est une adaptation du livre "Programming ASP.net 2.0 Applciation - advanced Topics" de Dino Esposito.

Source / Exemple :


using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.Compilation;
using System.CodeDom;
using System.Web.UI;

[ExpressionPrefix("Profile")]
public class ProfileExpressionBuilder : ExpressionBuilder
{
    /// <summary>
    /// When overridden in a derived class, returns an object that represents the parsed expression.
    /// </summary>
    /// <param name="expression">The value of the declarative expression.</param>
    /// <param name="propertyType">The type of the property bound to by the expression.</param>
    /// <param name="context">Contextual information for the evaluation of the expression.</param>
    /// <returns>
    /// An <see cref="T:System.Object"></see> containing the parsed representation of the expression; otherwise, null if <see cref="M:System.Web.Compilation.ExpressionBuilder.ParseExpression(System.String,System.Type,System.Web.Compilation.ExpressionBuilderContext)"></see> is not implemented.
    /// </returns>
    public override object ParseExpression(string expression, Type propertyType, ExpressionBuilderContext context)
    {
        return expression;
    }

    /// <summary>
    /// When overridden in a derived class, returns code that is used during page execution to obtain the evaluated expression.
    /// </summary>
    /// <param name="entry">The object that represents information about the property bound to by the expression.</param>
    /// <param name="parsedData">The object containing parsed data as returned by <see cref="M:System.Web.Compilation.ExpressionBuilder.ParseExpression(System.String,System.Type,System.Web.Compilation.ExpressionBuilderContext)"></see>.</param>
    /// <param name="context">Contextual information for the evaluation of the expression.</param>
    /// <returns>
    /// A <see cref="T:System.CodeDom.CodeExpression"></see> that is used for property assignment.
    /// </returns>
    public override CodeExpression GetCodeExpression(BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context)
    {

        String propertyName = (String)parsedData;
        CodePrimitiveExpression prim = new CodePrimitiveExpression(propertyName);
        CodeExpression[] args = new CodeExpression[1] { prim };

        CodeTypeReferenceExpression refType = new CodeTypeReferenceExpression(base.GetType());
        return new CodeMethodInvokeExpression(refType, "GetProperty", args);

    }

    /// <summary>
    /// Gets the value of the specified Profile Property.
    /// </summary>
    /// <param name="propertyName">Name of the Profile property.</param>
    /// <returns></returns>
    public static Object GetProperty(String propertyName)
    {
        return HttpContext.Current.Profile.GetPropertyValue( propertyName);
    }

    /// <summary>
    /// When overridden in a derived class, returns an object that represents an evaluated expression.
    /// </summary>
    /// <param name="target">The object containing the expression.</param>
    /// <param name="entry">The object that represents information about the property bound to by the expression.</param>
    /// <param name="parsedData">The object containing parsed data as returned by <see cref="M:System.Web.Compilation.ExpressionBuilder.ParseExpression(System.String,System.Type,System.Web.Compilation.ExpressionBuilderContext)"></see>.</param>
    /// <param name="context">Contextual information for the evaluation of the expression.</param>
    /// <returns>
    /// An object that represents the evaluated expression; otherwise, null if the inheritor does not implement <see cref="M:System.Web.Compilation.ExpressionBuilder.EvaluateExpression(System.Object,System.Web.UI.BoundPropertyEntry,System.Object,System.Web.Compilation.ExpressionBuilderContext)"></see>.
    /// </returns>
    public override object EvaluateExpression(object target, BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context)
    {
        return GetProperty((String)parsedData); 
    }

    /// <summary>
    /// When overridden in a derived class, returns a value indicating whether the current <see cref="T:System.Web.Compilation.ExpressionBuilder"></see> object supports no-compile pages.
    /// </summary>
    /// <value></value>
    /// <returns>true if the <see cref="T:System.Web.Compilation.ExpressionBuilder"></see> supports expression evaluation; otherwise, false.</returns>
    public override bool SupportsEvaluate
    {
        get
        {
            return true; 
        }
    }
}

Conclusion :


Vous pouvez trouver d'avantages d'informations sur le sujet sur mon blog : http://blogs.codes-sources.com/cyril/archive/2006/12/14/dynamic-expression-personnalise-profileexpressionbuilder-avec-asp-net-2-0.aspx

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.