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

在此例中,新前缀为“ExternalResource”。此新表达式的所需语法如下所示。

<%$ ExternalResource: [assemblyName]|[resourceType], [resourceKey] %>

此表达式将使用先前介绍的同一 GlobalExternalResourceProvider 从特定程序集提取资源。为支持这一新表达式,我们将创建一个自定义类型 ExternalResourceExpressionBuilder。表 2 总结了由每个替换的 ExpressionBuilder 方法所提供的功能。

表 2 总结了由每个替换方法所提供的功能

方法 说明
EvaluateExpression 在未编译页面中返回 ExternalResource 表达式的资源值。
GetCodeExpression 返回为 ExternalResource 表达式生成的代码。此代码将调用自定义资源提供程序 GlobalExternalResourceProvider。
ParseExpression 通过尝试访问表达式资源来验证 ExternalResource 表达式。如果无法找到资源,页面分析将失败。
SupportsEvaluate 属性 指示是否支持未编译页面判断。在此实现中,将返回 true。

使用 ExternalResourceExpressionBuilder,可声明如下所示的自定义本地化表达式。

<asp:Label ID="labExternalResource" runat="server" Text="<%$ ExternalResources:CommonResources|CommonTerms, Hello %>" meta:localize="false" ></asp:Label>

请记住,表达式在设计时并且在编译前进行分析。在页面分析期间会调用 ParseExpression,以验证资源表达式是否准确以及请求的资源是否实际存在。以下代码说明了此实现。

public override object ParseExpression(string expression, Type propertyType, ExpressionBuilderContext context)
{
  if (string.IsNullOrEmpty(expression))
  {
throw new ArgumentException(String.Format(Thread.CurrentThread.CurrentUICulture,Properties.Resources.Expression_TooFewParameters, expression));
  }
  ExternalResourceExpressionFields fields = null;
  string classKey = null;
  string resourceKey = null;
  string[] expParams = expression.Split(new char[] { ',' });
  if (expParams.Length > 2)
  {
throw new ArgumentException(String.Format(Thread.CurrentThread.CurrentUICulture, Properties.Resources.Expression_TooManyParameters, expression));
  }
  if (expParams.Length == 1)
  {
throw new ArgumentException(String.Format(Thread.CurrentThread.CurrentUICulture, Properties.Resources.Expression_TooFewParameters, expression));
  }
  else
  {
classKey = expParams[0].Trim();
resourceKey = expParams[1].Trim();
  }
  fields = new ExternalResourceExpressionFields(classKey, resourceKey);
 
  ExternalResourceExpressionBuilder.EnsureResourceProviderFactory();
  IResourceProvider rp = ExternalResourceExpressionBuilder.
s_resourceProviderFactory.CreateGlobalResourceProvider(fields.ClassKey);
  object res = rp.GetObject(fields.ResourceKey, CultureInfo.InvariantCulture);
  if (res == null)
  {
throw new ArgumentException(String.Format(Thread.CurrentThread.CurrentUICulture, Properties.Resources.RM_ResourceNotFound, fields.ResourceKey));
  }
  return fields;
}

时间: 2024-12-06 05:45:02

扩展ASP.NET 2.0资源提供程序模型(3)的相关文章

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

摘要: Microsoft ASP.NET 2.0 在本地化 Web 应用程序方面进行了许多奇妙的改进.即使有了所有这些奇妙的优点,但在本地化站点后不久,您可能还会开始考虑扩展性.本文将帮助您应用 ASP.NET 的扩展功能处理企业本地化方案并改进本地化开发过程. 简介 ASP.NET 2.0 在本地化 Web 应用程序方面进行了许多奇妙的改进.我曾在 MSDN 文章"ASP.NET 2.0 Localization Features: A Fresh Approach to Localizin

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

数据库资源条目 先来回顾一下要存储实际资源条目的数据库表结构或许对您有所帮助.示例包含一段 SQL 脚本,用于创建名为 CustomResourceProvidersSample 的数据库,还包含一个名为 StringResources 的表.表 1 包含以下字段: 表 1. 具有资源条目的数据库表 字段 说明 resourceType 每种资源的类别.可用其区分不同页面的本地资源,或根据用户定义的名称区分全局资源类型. cultureCode 来自 .NET 所使用的受支持的 CultureI

理解并扩展 ASP.NET 2.0 中的站点导航系统

asp.net|导航|站点 摘要:ASP.NET 2.0 站点导航系统构建于一个功能强大.灵活的体系结构之上,设计这样的体系结构是为了使其具有可扩展性.本文探究站点提供程序的体系结构并提供一个示例提供程序,该提供程序将文件系统公开为站点导航的数据源,从而替代了标准的 Web.sitemap XML 文件. 简介 大多数 web 站点采用可视化导航的某种形式来帮助用户轻松地浏览站点,以及查找他们所需的信息和 Web 页.尽管不同站点之间的感观效果千差万别,但是通常会使用相同的基本元素 - 以导航栏

ASP.net 2.0下应用程序离线信息

asp.net|程序 ASP.net 2.0 有一个新特性,就是支持应用程序离线信息. 什么是离线信息呢?以前我们在更新应用程序,导至asp.net应用程序重启,应用程序的用户通常会显示不友好的错误信息,或者IE一直显示加载状态. ASP.net 2.0支持您在应用程序根目录下放置一个app_offline.htm文件,用户请求时,系统会检查是否有这个文件存在,如果有,系统会将app_offline.htm文件的内容直接返回给用户. app_offline.htm的内容可以更改成任何您需要的内容

体验ASP.NET 2.0 中的数据访问控件

asp.net|访问|控件|数据 简介 数据访问一直是开发 Web 应用程序的一个关键问题.几乎每个商业应用程序都需要数据驱动的 Web 页面.由于数据访问如此普遍,开发人员不断地为简单的数据库任务重新生成复杂的代码就显得毫无意义了.开发人员需要从格式各异的不同数据源中快速访问数据.幸运的是,ASP.NET 2.0 中新增的数据访问控件和 ADO.NET 2.0 解决了这一问题. 对于传统的 ASP 和 ASP.NET 1.1 应用程序而言,开发人员不得不创建代码访问和更新数据库,将检索到的数据

ASP.NET 2.0: 使用自定义的配置文件提供程序管理Web用户

本文讨论: ASP.NET 2.0 配置文件提供程序 构建一个自定义提供程序 身份验证 和授权 本文使用了以下技术: ASP.NET, XML 借助 ASP.NET 2.0,您无需编写代码即 可向自己的网站添加身份验证.授权和各种配置文件.与以往相比,这显然是一个巨大的进步.与 ASP.NET 2.0 中的多数新功能一样,身份验证.授权和配置文件都有自己的内置提供程序.您可以将提供 程序看作是包含有完成某项特殊任务所用方法的模块.这些提供程序非常灵活,您可以通过指定属性对其 进行自定义.这些指定

ASP.NET 2.0轻松实现数据库应用开发

asp.net|数据|数据库 前言: 第一次使用ASP.NET 2.0就被它强大的功能和超高的效率所吸引,原本繁杂的过程被简化到无法置信的容易,而且据微软的所言12月中文版的VS2005正式版将给我们带来更强劲的风暴.对ASP.NET 2.0逐渐深入后,便产生了想把自己学习中发现的问题和体会与大家交流,遂有此文.声明:本文所有演示示例均基于Visual Web Developer 2005 Express Beta2,Visual Web Developer 2005 Express Editi

在ASP.NET 2.0中实现数据的绑定

ASP.NET的第一个版本就已经建立了一组新的数据库绑定控件.有了这些控件 的支持,数据的可视化和编辑就简单多了,其中一个最重要的控件就是DataGrid 控件.但是这个控件也有很多缺点.它为数据的排序,分页和编辑提供了一些内 置的功能,但必须手动实现. 而ASP.NET 2.0中采用了一种新的方式来解决以前版本的诸多问题, 并且提供了标准的功能.现在可以对任何数据源进行排序,分页和编辑----在大 多数情况下不需要输入任何代码.由于几乎所有的动态WEB程序都要考虑到与数据库的交互,幸运的是在A

轻松加密ASP.NET 2.0 Web程序配置信息

asp.net|web|程序|加密 一. 简介 当创建ASP.NET 2.0应用程序时,开发者通常都把敏感的配置信息存储在Web.config文件中.最典型的示例就是数据库连接字符串,但是包括在Web.config文件中的其它敏感信息还包括SMTP服务器连接信息和用户凭证数据,等等.尽管默认情况下可以配置ASP.NET以拒绝所有对扩展名为.config的文件资源的HTTP请求:但是,如果一个黑客能够存取你的web服务器的文件系统的话,那么,Web.config中的敏感信息仍然能够被窃取.例如,也