ASP.NET默认的表达式和表达式生成器可以在网页中访问一些配置文件中的值。

    目前有三种表达式生成器:访问ConnectionStrings、Appsettings、检索本地资源文件值的表达式生成器。例如下面的例子:

    访问ConnectionStrings的表达式生成器:

<asp:SqlDataSource ID="SqlDataSource1" Runat="server"  SelectCommand="SELECT * FROM [Customers]"  ConnectionString="<%$ ConnectionStrings:ConnectionString %>" />

    访问Appsettings的表达式生成器:

<asp:Label runat="server" ID="Label1"  Text=”<%$ AppSettings: LabelText %>"/>

    检索本地资源文件值的表达式生成器:


<asp:Label runat="server" ID="Label1"  Text="<%$ Resources: MyAppResources,Label1Text %>" />

    除了使用默认的表达式生成器外,还可以通过从System.Web.Compilation.ExpressionBuilder基类中派生类来创建自己的表达式。CodeExpression类是.NET的CodeDom基础结构中的一个基类,这个CodeDom基础结构有助于在运行期间动态地创建和运行代码。在派生类中有两个属性(ExpressionPrefix和ExpressionEditor)会帮助.NET确定把这个类用作表达式,而且在分析表达式时,这两个属性还会帮助.NET定位正确的表达式生成器类。

    创建了表达式生成器类后,可以通过在web.config文件的compilation节点中添加expressionBuilders节点来实现在前台页面应用该表达式生成器类。注意将ExpressionPrefix的值添加到expressionBuilder中,可帮助ASP.NET在运行期间定位正确的表达式生成器类。

    这个基类提供了几个可重写的方法(如果希望ASP.NET正确分析表达式,就需要实现这些可重写的方法):

    1. GetCodeExpression(entry, object parsedData,  ExpressionBuilderContext context)方法:

        该方法用于ASP.NET在运行期间检索数据值。其中BoundPropertyEntry参数项指定表达式绑定到哪个属性上;对象参数parsedData包含由ParseExpression方法分析和返回的数据;ExpressionBuilderContext参数上下文允许引用与表达式相关的虚拟路径或模板化的控件。下面示例的该方法返回一个派生于CodeExpression基类的CodeCastExpression对象,CodeCastExpression告诉.NET要生成相应代码,将一种数据类型强制转换为另一种数据类型。注意派生于CodeExpression的许多类都可用于生成最终的代码表达式。

    2. ParseExpression (string expression, Type propertyType, ExpressionBuilderContext context) 方法:

        该方法可以把分析过的表达式数据传送给GetCodeExpression方法,以供GetCodeExpression方法使用该数据。

    3. SupportsEvaluate属性:

        如果要在非编译的情形下运行Web站点(在@Page指令中指定compilationMode ="never"),就需要重写SupportsEvaluate属性和EvaluateExpression方法。在页面以非编译模式执行时,SupportsEvaluate属性返回一个布尔值,告诉ASP.NET这个表达式是否能计算。如果返回True,并且页面在非编译模式下执行,就使用EvaluateExpression方法返回数据值,而不是使用GetCodeExpression方法。

    4. EvaluateExpression(object target,BoundPropertyEntry entry, object parsedData,ExpressionBuilderContext context)方法:

        EvaluateExpression方法返回一个表示数据值的对象。如果要重写EvaluateExpression方法,只需从SupportsEvaluate属性中返回True,然后从EvaluateExpression方法中返回一个对象即可。

 

    重写实例代码:

 

[ExpressionPrefix("MyFirstCustomExpression")]  
[ExpressionEditor("MyFirstCustomExpressionEditor")]  
public class MyFirstCustomExpression : ExpressionBuilder  
{  
    public override System.CodeDom.CodeExpression GetCodeExpression(BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context)  
    {  
        return new CodeCastExpression("Int64", new CodePrimitiveExpression(parsedData));  
    }  
 
    public override object ParseExpression (string expression, Type propertyType, ExpressionBuilderContext context)  
    {  
        return expression;  
    } 
    public override bool SupportsEvaluate  
    {  
        get  
        {  
            return true;  
        }  
    }
    public override object EvaluateExpression(object target, BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context)  
    {  
        return parsedData;  
    }
}

 

将派生类添加到web.config中:

<compilation debug="true" strict="false" explicit="true">
<expressionBuilders>
<add expressionPrefix="MyCustomExpression" type="MyCustomExpression"/>
</expressionBuilders>
</compilation>