如何在ASP.NET 2.0中定制Expression Builders

简介:
expressions是asp.net 2.0中的新特色,它可以使你在asp.net的页面里很方便的使用自定义的属性. 
在ASPX页里只要使用$符号就可以访问到,你定制的属性了. 
例如我们看个例子: 
ASPX页面中如下:

< asp:SqlDataSource  ID ="SqlDataSource1"  runat ="server"  ConnectionString ="<%$connectionStrings:Pubs %>"  SelectCommand ="select * from catalog" ></ asp:SqlDataSource >


web.config文件中如下: 

< configuration >  
    
< appSettings />  
  
< connectionStrings >  
    
< add  name ="Pubs"  connectionString ="server=localhost;database=getwant;Trusted_Connection=yes" />  
  
</ connectionStrings >  
</ configuration >
因为在web.config中默认就有了connectionStrings的这个节点,所以我们很方便的使用add增加了一个属性Pubs.
而如何自定义我们自己使用的节点呢?例如:<%$ Version:MajorMinor%>可以显示当前环境下asp.net的主版本号和次版本号呢?
如果我们直接在页面中输入上面的表达式,编译器会告诉你,Version并没有被定义,请在expressionBuilders节点中定制.其实这时候就要用到ExpressionBuilder类了.

System.Web.Compilation.ExpressionBuilder  就是expression builders的基类.
我们看看web.config中的设置:

< compilation  debug ="true" >
            
< expressionBuilders >
                
< add  expressionPrefix ="Version"  type ="VersionExpressionBuilder" />
            
</ expressionBuilders >
        
</ compilation >
怎么样是不是很简单呢?定义一个expressionPrefix为Version就可以了.
不过有人说那个type后面的是什么意思呢,有VersionExpressionBuilder这个类吗?
其实这个是我们自己继承了ExpressionBuilder的类.

public   class  VersionExpressionBuilder:ExpressionBuilder
{
    
public override CodeExpression GetCodeExpression(BoundPropertyEntry entry,object parsedData,ExpressionBuilderContext context)
    
{
        
string param = entry.Expression;
        
if (string.Compare(param, "All"true== 0)
        
{
            
return new CodePrimitiveExpression(string.Format("{0}.{1},{2}.{3}", Environment.Version.Major, Environment.Version.Minor, +
                Environment.Version.Build, Environment.Version.Revision));
        }

        
else if (string.Compare(param, "MajorMinor"true== 0)
        
{
            
return new CodePrimitiveExpression(string.Format("{0}.{1}", Environment.Version.Major, Environment.Version.Minor));
        }

        
else
            
throw new InvalidOperationException("User $ Version:All or $ Version:MajorMinor");
    }

}
这时候我们在ASPX页面中如下设置就可以通过编译了:

 ASP.NET   < asp:Literal  ID ="Literal1"  runat ="server"  Text ="<% $ Version:MajorMinor %>" ></ asp:Literal >
显示的为"ASP.NET 2.0"
把表示式改为:<%$ Version:All %>就会显示为"ASP.NET 2.0,50727.42 "

Expression builders  1   2  - a nice way to assign property values in web controls
[url]http://www.cnblogs.com/cathsfz/archive/2006/12/02/580142.html[/url]





本文转自 张善友 51CTO博客,原文链接:http://blog.51cto.com/shanyou/74377,如需转载请自行联系原作者
目录
相关文章
一起谈.NET技术,Expression Blend实例中文教程(2) - 界面快速入门
上一篇主要介绍Expression系列产品,另外概述了Blend的强大功能,本篇将用Blend 3创建一个新Silverlight项目,通过创建的过程,对Blend进行快速入门学习。 在开始使用Blend前,首先需要进行Silverlight的开发环境搭建,在银光中国网(SilverlightChina.Net)有篇“轻松建立Silverlight开发环境”,其中列出了建立Silverlight开发环境的几个步骤,另外,我在过去发布过一篇“Silverlight开发工具集合”文章,也列出了Silverlight项目开发必装工具软件,这里对于开发环境的搭建,我就不再赘述。
1293 0
|
Web App开发 移动开发 HTML5
一起谈.NET技术,为Expression Web 4 添加HTML5 标签支持
  大家都知道Expression Web 4 是用来编写网页脚本的一款软件,包含的语言类型涉及:HTML、ASP、PHP、CSS,但它并不支持HTML5。如下图所示,在HTML5 中的 标签并不能获得智能感应,这样在开发过程中会变得很麻烦。
1503 0
|
Windows
一起谈.NET技术,Hello,Expression Blend 4 (含Demo教程和源码)
  前言   这段时间的开发不会用到Blend,到年底才会大量用到,本来打算到时候在写Blend相关的笔记,不过看到一些朋友还比较感兴趣,所以这里提前整理了一下。   首先,我希望你记住下面几点:   1、 Blend并不完全是为Designer设计的,玩得最好的一定是Programmer  2、必须了解Behavior,Blend很多特性基于Behavior   Expression Blend 的技术发展历史   2007   Blend的第一个版本就可以进行基本的动画设计。
1142 0
|
.NET
一起谈.NET技术,关于Expression Tree和IL Emit的所谓的&quot;性能差别&quot;
  昨天写了《三种属性操作性能比较》,有个网友写信问我一个问题:从性能上看,Expression Tree和IL Emit孰优孰劣?虽然我在回信中作了简单的回答,但不知道这个网友是否懂我的意思。反正今天呆在家里也没事儿,干脆再就这个话题再写一篇文章。
929 0
|
测试技术
一起谈.NET技术,三种属性操作性能比较:PropertyInfo + Expression Tree + Delegate.CreateDelegate
  在《上篇》中,我比较了三种属性操作的性能:直接操作,单纯通过PropertyInfo反射和IL Emit。本篇继续讨论这个话题,我们再引入另外两种额外的属性操作方式:Expression Tree(这和IL Emit基本一致)和通过Delegate的静态方法CreateDelegate创建相应的委托进行属性的赋值和取值。
976 0
|
SQL 存储 .NET
一起谈.NET技术,使用LINQ Expression构建Query Object
  这个问题来源于Apworks应用开发框架的设计。由于命令与查询职责的分离,使得基于CQRS体系结构风格的应用系统的外部存储系统的结构变得简单起来:在“命令”部分,简单地说,只需要 Event Store和Snapshot Store来保存Domain Model;而“查询”部分,则又是基于事件派送与侦听的系统集成。
1117 0
|
测试技术
三种属性操作性能比较:PropertyInfo + Expression Tree + Delega“.NET技术”te.CreateDelegate
  在《上篇》中,我比较了三种属性操作的性能:直接操作,单纯通过PropertyInfo反射和IL Emit。本篇继续讨论这个话题,我们再引入另外两种额外的属性操作方式:Expression Tree(这和IL Emit基本一致)和通过Delegate的静态方法CreateDelegate创建相应的委托进行属性的赋值和取值。
1192 0
|
SQL 存储 .NET
使用LINQ Expression构建Que“.NET研究”ry Object
  这个问题来源于Apworks应用开发框架的设计。由于命令与查询职责的分离,使得基于CQRS体系结构风格的应用系统的外部存储系统的结构变得简单起来:在“命令”部分,简单地说,只需要 Event Store和Snapshot Store来保存Domain Model;而“查询”部分,则又是基于事件派送与侦听的系统集成。
1114 0
|
.NET
关于Expression Tree和IL Emit的所谓的&quot;性能差别&quot“.NET研究”;
  昨天写了《三种属性操作性能比较》,有个网友写信问我一个问题:从性能上看,Expression Tree和IL Emit孰优孰劣?虽然我在回信中作了简单的回答,但不知道这个网友是否懂我的意思。反正今天呆在家里也没事儿,干脆再就这个话题再写一篇文章。
836 0
|
测试技术
三种属性操作性能比较:PropertyInfo + Expression Tree + Del“.NET研究”egate.CreateDelegate
  在《上篇》中,我比较了三种属性操作的性能:直接操作,单纯通过PropertyInfo反射和IL Emit。本篇继续讨论这个话题,我们再引入另外两种额外的属性操作方式:Expression Tree(这和IL Emit基本一致)和通过Delegate的静态方法CreateDelegate创建相应的委托进行属性的赋值和取值。
1103 0