ASP.NET 2.0中的表达式构造器(Expression Builder)

ASP.NET 引入了新的表达式构造器(Expression Builder),它使用声明性语法,在运行时用真正的值所代替。表达式值可以来自本地化资源、连接字符串或者配置文件中的应用程序设置。表达式的值在页面被解析的时候被评估。

表达式通常用于在数据源控件中引用一个连接字符串,从而代替直接在属性中设置。你可以用在任何属性的设置,从而避免使用一个静态值。

表达式构造器允许控件属性值在页面解析的时候才被设置,当页面解析遇到这样<%$ prefix:value %>一个格式的时候就会创建一个表示式构造器。

表达式构造器的好处
  • 可以避免书写很长的属性设置代码。表达式构造器运行使用动态的声明语法。
  • 一个表达式构造器可以跨多个页面引用。所有的更改都被集中在一处。
  • 表达式构造器是可以扩展的。你可以定义自己的表达式,在运行时使用自己的表示式处理程序来解析返回值。
  • 表达式构造器语法是语言中立的。可以跨不同的.NET语言使用同一个表示式。
  • 表达式构造器同时提供了运行期和设计期支持。设计器支持意味着当为窗体属性设计表示式的时候可以使用表达式对话框。
表达式构造器语法

表达式构造器的语法如下:
 
   
None.gif < %$ expression  prefix: expression value % >
“$”符号指示ASP.NET这里是一个表达式。expression prefiex定义表达式的类型,如:AppSettions, ConnectionStrings或者字符串资源(String resources)。“:”后面跟的是ASP.NET在运行时真正要替换的表达式的值。
 
    
None.gif < configuration >   
None.gif  
< appSettings >   
None.gif    
< add  key ="ButtonName"  value ="ExpressionBuilder" />   
None.gif  
</ appSettings >   
None.gif  dot.gif  
 
    
None.gif < asp:Button  ID ="Button1"  runat ="server"  Text ='<%$Appsettings:ButtonName  % > ' />  
看运行结果:
uploads/200708/08_114836_pic1.gif
图1 - 这段代码演示了如何使用表达式构造器来设置控件的属性。

表达式构造器的类型

ASP.NET 2.0 提供了3种内建的构造器类型
AppSettingsExpressionBuilder: 返回在Web配置文件AppSettings段用户自定义的key-value键值对
ConnectionStringsExpressionBuilder: 返回在Web配置文件ConnectionString段定义的连接字符串
ResourceExpressionBuilder: 处理应用程序本地化所引用的字符串资源。
 
    
None.gif < asp:SqlDataSource  ID ="SqlDataSource1"     
None.gif                   ConnectionString
="<%$ConnectionStrings:ExpNorthwindConnection %>"     
None.gif                   runat
="server"   />
上面的表示式引用在配置文件connectionStrings定义的名为ExpNorthwindConnection的连接字符串。每个连接字符串都有一个名字,你可以在表示式里引用它。
 
    
None.gif < add  name ="ExpNorthwindConnection"     
None.gif     connectionString
="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;User ID=sa;Password=sa"   
None.gif     providerName
="System.Data.SqlClient"   />
CustomExpressionBuilder
ExpressionBuilder类是表达式构造器的基类。当我们定义自己的CustomExpressionBuilder类时,需要继承该类并重写(override)GetCodeExpression方法

实现CustomExpressionBuilder有以下几步:

定义CustomExpressionBuilder

如上面所说,开发一个自定义的ExpressionBuilder需要继承ExpressionBuilder抽象类,并重写GetCodeExpression方法。
 
    
None.gif public   class  CustomXmlExpressionBuilder : ExpressionBuilder  
GetCodeExpression返回在一个表示调用方法的表达式。里面用到了CodeDom知识,对CodeDom不熟悉的朋友,请查阅相关资料 [redface]。大家需要知道的就是ASP.NET需要这样一个类型的返回值来进行表达式解析,他会在这个返回值上执行一些调用、处理。
 
    
None.gif public   override  System.CodeDom.CodeExpression GetCodeExpression(BoundPropertyEntry entry,  object  parsedData, ExpressionBuilderContext context)   
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {   
InBlock.gif    CodeTypeReferenceExpression thisType 
= new CodeTypeReferenceExpression(base.GetType());   
InBlock.gif  
InBlock.gif    CodePrimitiveExpression expression 
= new CodePrimitiveExpression(entry.Expression.Trim().ToString());   
InBlock.gif  
InBlock.gif    
string evaluationMethod = " GetXmlKeyValue";   
InBlock.gif  
ExpandedSubBlockStart.gifContractedSubBlock.gif    
return new CodeMethodInvokeExpression(thisType, evaluationMethod, new CodeExpression[] dot.gif{ expression });   
InBlock.gif  
ExpandedBlockEnd.gif}
 
方法GetXmlKeyValue接受表达式(这里是键“LinkValue”)作为参数,然后查询XML文件,将结果返回(这里是键值“ http://www.xwy2.com”)。
 
    
None.gif public   static   string  GetXmlKeyValue( string  expression)   
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {   
InBlock.gif    XmlDocument xmlSettingDoc 
= (XmlDocument)HostingEnvironment.Cache["XmlSettings"];   
InBlock.gif  
InBlock.gif    
if (xmlSettingDoc == null)   
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{   
InBlock.gif        xmlSettingDoc 
= new XmlDocument();   
InBlock.gif  
InBlock.gif        
string settingsFile = HostingEnvironment.MapPath("~/XmlFile.xml");   
InBlock.gif  
InBlock.gif        xmlSettingDoc.Load(settingsFile);   
InBlock.gif  
InBlock.gif        CacheDependency settingsDepend 
= new CacheDependency(settingsFile);   
InBlock.gif  
InBlock.gif        HostingEnvironment.Cache.Insert(
"XmlPath", xmlSettingDoc, settingsDepend);   
ExpandedSubBlockEnd.gif    }
   
InBlock.gif  
InBlock.gif    
string getXPATHKey = String.Format("//add[@key='{0}']", expression);   
InBlock.gif  
InBlock.gif    XmlNode wantedRecord 
= xmlSettingDoc.SelectSingleNode(getXPATHKey);   
InBlock.gif  
InBlock.gif    
if (wantedRecord != null)   
InBlock.gif        
return wantedRecord.Attributes["value"].Value;   
InBlock.gif  
InBlock.gif    
return "Unable to Process Expression";   
ExpandedBlockEnd.gif}
配置Web.config

首先要将上面的CustomXmlExpressionBuilder类放在App_Code文件夹下,然后在Web.config中添加如下的配置:
 
    
None.gif < compilation  debug ="true"  strict ="false"  explicit ="true" >   
None.gif  
< expressionBuilders >   
None.gif    
< add  expressionPrefix ="XmlFile"   
None.gif         type
="CustomXmlExpressionBuilder" />   
None.gif  
</ expressionBuilders >   
None.gif
</ compilation  >
现在就可以使用我们自定义的表达式构造器了:
 
    
None.gif < asp:label  ID ="CustomExpBuilder"  runat ="server"  Text ='<%$  XmlFile: LinkValue % > ' /> 
这是运行结果:
uploads/200708/08_133146_pic2.gif
图2 - 自定义的表达式构造器用来将自定义的声明语法替换为真实值。

rar.gif 示例代码(在VS 2005下编写)

参阅:
主要内容来自: Expression Builders in ASP.NET 2.0

转载于:https://www.cnblogs.com/LoongTsui/archive/2007/08/08/847809.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值