111
技術社區[雲棲]
使用ExpressionBuilder 類 在分析頁的過程中計算表達式
ExpressionBuilder 類是在分析頁的過程中創建代碼表達式的表達式生成器的基類。
表達式生成器分析聲明性表達式,並創建代碼來檢索綁定到控件屬性的值。在非編譯方案中,支持非編譯功能的表達式生成器在運行時計算表達式。
頁分析器如果遇到用 <%$ %> 字符串分隔的表達式,則根據字符串中的前綴為表達式創建表達式生成器。前綴是字符串中冒號 (:) 左側的部分。例如,分析器如果遇到字符串 <%$ ConnectionStrings:MessageDB %>,則創建一個 ConnectionStringsExpressionBuilder 對象。前綴與 Web.config 文件的 ExpressionBuilders 節中的表達式生成器相關聯。
聲明性表達式的右側被傳遞給表達式生成器進行計算。重寫 GetCodeExpression 方法可生成與頁一起編譯的代碼。
如果希望自定義表達式生成器在不編譯的頁上是活動的,還必須重寫 EvaluateExpression 方法以返回表示表達式結果的對象。此外,還必須重寫 SupportsEvaluate 屬性,以指示自定義表達式生成器不支持非編譯頁。
可以定義一組屬性和方法,用於選擇和計算在設計時使用表達式編輯器與控件屬性進行關聯的表達式。編輯器通過類級別的元數據在表達式生成器上進行標記。
繼承者說明:
從 ExpressionBuilder 類繼承時,必須重寫 GetCodeExpression 方法。
下麵示例說明:如何通過實現 ExpressionBuilder 抽象類來構建自定義表達式生成器。
第一步:首先在 Web.config 文件中注冊自定義表達式生成器。
<configuration> <system.web> <compilation> <expressionBuilders> <add expressionPrefix="MyCustomExpression" type="MyExpressionBuilder"/> </expressionBuilders> </compilation> </system.web> </configuration>
第二步:編寫後台計算表達式的類,該類必須放在 App_Code 文件夾中。
using System; using System.CodeDom; using System.Web.UI; using System.ComponentModel; using System.Web.Compilation; using System.Web.UI.Design; // Apply ExpressionEditorAttributes to allow the // expression to appear in the designer. [ExpressionPrefix("MyCustomExpression")] [ExpressionEditor("MyCustomExpressionEditor")] public class MyExpressionBuilder : ExpressionBuilder { public static object GetEvalData(string expression, Type target, string entry) { 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[3]; expressionArray1[0] = new CodePrimitiveExpression(entry.Expression.Trim()); expressionArray1[1] = new CodeTypeOfExpression(type1); expressionArray1[2] = new CodePrimitiveExpression(entry.Name); return new CodeCastExpression(descriptor1.PropertyType, new CodeMethodInvokeExpression(new CodeTypeReferenceExpression(base.GetType()), "GetEvalData", expressionArray1)); } public override bool SupportsEvaluate { get { return true; } } }
第三步:引用計算表達式 。
<asp:Label ID="Label1" runat="server" Text="<%$ MyCustomExpression:Hello, world! %>" />
最後更新:2017-04-02 06:51:20