快速业务通道

扩展ASP.NET 2.0资源提供程序模型(3)

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-21
心目的是创建 GlobalExternalResourceProvider 以及调用 GetObject() 来检索资源。

编译页面时,将在页面分析后生成代码。此时,将调用表达式生成器的 GetCodeExpression 实现。此操作将返回在运行时检索资源值所需的代码,如下所示。

public override System.CodeDom.CodeExpression GetCodeExpression(BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context)
{
  ExternalResourceExpressionFields fields = parsedData as ExternalResourceExpressionFields;
CodeMethodInvokeExpression exp = new CodeMethodInvokeExpression(new CodeTypeReferenceExpression(typeof(ExternalResourceExpressionBuilder)), "GetGlobalResourceObject", new CodePrimitiveExpression(fields.ClassKey), new CodePrimitiveExpression(fields.ResourceKey));
return exp;
}

GetCodeExpression 的输出内容将导致生成的代码类似于如下所示的粗黑体代码。

labExternalResource.Text = ExternalResourceExpressionBuilder.GetGlobalResourceObject("CommonResources|CommonTerms", "Hello") as string;

您会注意到,生成的代码依赖由 ExternalResourceExpressionBuilder 实现的静态方法。GetGlobalResourceObject 是一种辅助方法,可实例化 GlobalExternalResourceProvider 并且检索资源条目。对于已编译页面,此代码在运行时从外部资源检索值。

对于未编译页面,在运行时通过调用 EvaluateExpression 来对表达式进行判断。ExternalResourceExpressionBuilder 实现 EvaluateExpression 的替换,其再次使用 GlobalExternalResourceProvider 检索适合的资源。

public override object EvaluateExpression(object target, BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context)
{
  ExternalResourceExpressionFields fields = parsedData as ExternalResourceExpressionFields;
  ExternalResourceExpressionBuilder.EnsureResourceProviderFactory();
  IResourceProvider provider = ExternalResourceExpressionBuilder.
s_resourceProviderFactory.CreateGlobalResourceProvider(fields.ClassKey);
  return provider.GetObject(fields.ResourceKey, null);
}

配置自定义表达式生成器后,您可以随意加入声明语句,以便从外部程序集检索资源,同时默认本地化表达式仍用于从 App_LocalResources 或 App_GlobalResources 检索值。

ExpressionBuilder 配置

要配置自定义表达式构建器,您需要将其添加到 Web.config 中的 <expressionBuilders> 部分。在本例中,我们将“ExternalResources”前缀的 ExternalResourceExpressionBuilder 与此配置关联。

<expressionBuilders>
  <add expressionPrefix="ExternalResources" type="CustomResourceProviders.ExternalResourceExpressionBuilder, CustomResourceProviders, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f201d8942d9dbbb1"/>
</expressionBuilders>

现在,将根据先前部分介绍的 ExternalResourceExpressionBuilder 实现分析或判断所有使用“ExternalResources”前缀的资源表达式。

访问本地、全局和外部资源

列表 5 说明了使用从默认和自定义来源提取资源的全部三种本地化表达式(隐式、显式和自定义显式)的应用程序。

列表 5. 单一页面中的隐式、显式和自定义显式本地化表达式

<asp:Label ID="labHelloLocal" runat="server" Text="HelloDefault" meta:resourcekey="labHelloL

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号