ExpressionBuilder的常见说明见https://msdn.microsoft.com/zh-cn/library/System.Web.Compilation.ExpressionBuilder(v=vs.80).aspx

下面贴代码:

编写自定义ExpressionBuilder用于翻译,翻译文件缓存依赖。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Web.Compilation;
using System.Web.UI;
using System.CodeDom;
using System.Web.Hosting;
using System.Web.Caching;
using System.Xml; namespace ExpressionBuilderTest.Library
{
/// <summary>
/// 自定义ExpressionBuilder
/// </summary>
public class SPExpressionBuilder:ExpressionBuilder
{
// Create a method that will return the result
// set for the expression argument.
public static object GetEvalData(string expression, Type target, string entry)
{
XmlDocument doc = (XmlDocument)HostingEnvironment.Cache["transDoc"];
if (doc == null)
{
doc = new XmlDocument();
string filePath = HostingEnvironment.MapPath("~/Translate.config");
doc.Load(filePath);
CacheDependency fileDep = new CacheDependency(filePath);
HostingEnvironment.Cache.Insert("transDoc", doc,fileDep);
}
XmlNode xn = doc.SelectSingleNode(string.Format("/configuration/p[@key='{0}']",expression));
if (xn != null)
{
return ((XmlElement)xn).GetAttribute("value");
}
return expression;
} public override object EvaluateExpression(object target, BoundPropertyEntry entry,
object parsedData, ExpressionBuilderContext context)
{
return GetEvalData(entry.Expression, target.GetType(), entry.Name);
} public override CodeExpression GetCodeExpression(BoundPropertyEntry entry,
object parsedData, ExpressionBuilderContext context)
{
Type type1 = entry.DeclaringType;
PropertyDescriptor descriptor1 = TypeDescriptor.GetProperties(type1)[entry.PropertyInfo.Name];
CodeExpression[] expressionArray1 = new CodeExpression[];
expressionArray1[] = new CodePrimitiveExpression(entry.Expression.Trim());
expressionArray1[] = new CodeTypeOfExpression(type1);
expressionArray1[] = new CodePrimitiveExpression(entry.Name);
return new CodeCastExpression(descriptor1.PropertyType, new CodeMethodInvokeExpression(new
CodeTypeReferenceExpression(base.GetType()), "GetEvalData", expressionArray1));
} public override bool SupportsEvaluate
{
get { return true; }
}
}
}

翻译文件为Translate.config.格式如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<p key="_welCom_" value="You Are Welcome!"/>
</configuration>

好了,现在在web.config里配置就可以使用了。web.config配置如下:

<?xml version="1.0" encoding="utf-8"?>

<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0">
<expressionBuilders>
<add expressionPrefix="SPExpression"
type="ExpressionBuilderTest.Library.SPExpressionBuilder"/>
</expressionBuilders>
</compilation>
</system.web> </configuration>

在页面上拖一个label

<asp:Label ID="Label1" runat="server" Text="<%$SPExpression:_welCom_ %>"></asp:Label>

即可实现翻译。

自定义ExpressionBuilder的更多相关文章

  1. Asp.Net之自定义表达式构造器(ExpressionBuilder)

    在Asp.Net的Page页面中我们经常会使用到资源文件.读取资源文件的方式为:<%$Resources:Resource1,Test1%>,这样就可以显示Resource1这个资源文件中 ...

  2. 关于Unity3D自定义编辑器的学习

    被人物编辑器折腾了一个月,最终还是交了点成品上去(还要很多优化都还么做).  刚接手这项工作时觉得没概念,没想法,不知道.后来就去看<<Unity5.X从入门到精通>>中有关于 ...

  3. 一起学微软Power BI系列-使用技巧(5)自定义PowerBI时间日期表

    1.日期函数表作用 经常使用Excel或者PowerBI,Power Pivot做报表,时间日期是一个重要的纬度,加上做一些钻取,时间日期函数表不可避免.所以今天就给大家分享一个自定义的做日期表的方法 ...

  4. JavaScript自定义浏览器滚动条兼容IE、 火狐和chrome

    今天为大家分享一下我自己制作的浏览器滚动条,我们知道用css来自定义滚动条也是挺好的方式,css虽然能够改变chrome浏览器的滚动条样式可以自定义,css也能够改变IE浏览器滚动条的颜色.但是css ...

  5. ASP.NET Aries 入门开发教程8:树型列表及自定义右键菜单

    前言: 前面几篇重点都在讲普通列表的相关操作. 本篇主要讲树型列表的操作. 框架在设计时,已经把树型列表和普通列表全面统一了操作,用法几乎是一致的. 下面介绍一些差距化的内容: 1:树型列表绑定: v ...

  6. ASP.NET Aries 入门开发教程5:自定义列表页工具栏区

    前言: 抓紧时间,继续写教程,因为发现用户期待的内容,都在业务处理那一块. 不得不继续勤劳了. 这节主要介绍工具栏区的玩法. 工具栏的默认介绍: 工具栏默认包括5个按钮,根据不同的权限决定显示: 添加 ...

  7. UWP中实现自定义标题栏

    UWP中实现自定义标题栏 0x00 起因 在UWP开发中,有时候我们希望实现自定义标题栏,例如在标题栏中加入搜索框.按钮之类的控件.搜了下资料居然在一个日文网站找到了一篇介绍这个主题的文章: http ...

  8. JavaScript 自定义对象

    在Js中,除了Array.Date.Number等内置对象外,开发者可以通过Js代码创建自己的对象. 目录 1. 对象特性:描述对象的特性 2. 创建对象方式:对象直接量.new 构造函数.Objec ...

  9. 【WCF】自定义错误处理(IErrorHandler接口的用法)

    当被调用的服务操作发生异常时,可以直接把异常的原始内容传回给客户端.在WCF中,服务器传回客户端的异常,通常会使用 FaultException,该异常由这么几个东东组成: 1.Action:在服务调 ...

随机推荐

  1. mfc截图

    1.进入截图状态 PRTSCRING = TRUE;//开始截图标志为TRUE AfxGetMainWnd()->ShowWindow(SW_SHOWMAXIMIZED);//主窗口最大化 Se ...

  2. C# Ini配置文件

    public class INIUserAccound { static IniFile Ini = new IniFile(AppDomain.CurrentDomain.BaseDirectory ...

  3. Have You Ever Wondered About the Difference Between NOT NULL and DEFAULT?

    https://blog.jooq.org/2014/11/11/have-you-ever-wondered-about-the-difference-between-not-null-and-de ...

  4. Node.js 事件循环(Event Loop)介绍

    Node.js 事件循环(Event Loop)介绍 JavaScript是一种单线程运行但又绝不会阻塞的语言,其实现非阻塞的关键是“事件循环”和“回调机制”.Node.js在JavaScript的基 ...

  5. oracle小测试

    1.请解释以下几个函数意思:NVL.TRUNC.DECODE.TO_DTAE.TO_CHAR.CONVERT.ROUND.TRIM.ISNULL.SUBSTR.GROUP BY.HAVING 答: N ...

  6. ABAP WRITE、WRITE TO、FORMAT语句

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  7. FJNU 1152 Fat Brother And Integer(胖哥与整数)

    FJNU 1152 Fat Brother And Integer(胖哥与整数) Time Limit: 1000MS   Memory Limit: 257792K [Description] [题 ...

  8. GBASE结构理解

    GBASE数据库 8a 8a Cluster 8t 8m BI 8d 8 分析型数据库 分布式并行数据库集群 高端事务性数据库 高速内存数据库 可视商业智能 大型目录服务体系 硬加密安全数据库 数据分 ...

  9. C# 线程(六):定时器

    From : http://kb.cnblogs.com/page/42532/ Timer类:设置一个定时器,定时执行用户指定的函数. 定时器启动后,系统将自动建立一个新的线程,执行用户指定的函数. ...

  10. 关于Android 构建

    在简书上面有系列关于Android 的文章,还不错,部分同学可以在开发过程中阅读和学习:www.jianshu.com/collection/3fde3b545a35 关于Android 构建,看到这 ...