ASP.NET Tutorial/Development/ExpressionBuilder

Материал из .Net Framework эксперт
Версия от 14:56, 26 мая 2010; Admin (обсуждение | вклад) (1 версия)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Creating a Custom ExpressionBuilder

   <source lang="csharp">

An ExpressionBuilder class generates one expression from another expression. File: App_Code\LookupExpressionBuilder.cs using System; using System.CodeDom; using System.Web.UI; using System.ruponentModel; using System.Web.rupilation; using System.Xml; using System.Web.Hosting; using System.Web.Caching; namespace MyNamespace {

   public class LookupExpressionBuilder : ExpressionBuilder
   {
       public override CodeExpression GetCodeExpression(BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context)
       {
           CodeTypeReferenceExpression refMe = new CodeTypeReferenceExpression(base.GetType());
           CodePrimitiveExpression expression = new CodePrimitiveExpression(entry.Expression);
           return new CodeMethodInvokeExpression(refMe, "GetEvalData", new CodeExpression[] { expression });
       }
       public override object EvaluateExpression(object target, BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context)
       {
           return GetEvalData(entry.Expression);
       }
       public override bool SupportsEvaluate
       {
           get
           {
               return true;
           }
       }
       public static string GetEvalData(string expression)
       {
           XmlDocument lookupDoc = (XmlDocument)HostingEnvironment.Cache["Lookup"];
           if (lookupDoc == null)
           {
               lookupDoc = new XmlDocument();
               string lookupFileName = HostingEnvironment.MapPath ("~/Lookup.config");
               lookupDoc.Load(lookupFileName);
               CacheDependency fileDepend = new CacheDependency(lookupFileName);
               HostingEnvironment.Cache.Insert("Lookup", lookupDoc, fileDepend);
           }
           string search = String.Format("//add[@key="{0}"]", expression);
           XmlNode match = lookupDoc.SelectSingleNode(search);
           if (match != null)
               return match.Attributes["value"].Value;
           return "[no match]";
       }
   }

}


File: Web.Config <configuration>

 <system.web>
   <compilation>
     <expressionBuilders>
       <add expressionPrefix="lookup"
          type="MyNamespace.LookupExpressionBuilder" />
     </expressionBuilders>
   </compilation>
 </system.web>

</configuration>

File: Lookup.config <lookup>

 <add key="WelcomeMessage" value="Welcome to our Web site!" />
 <add key="Copyright" value="All content copyrighted by the company." />

</lookup>

File: ShowLookupExpressionBuilder.aspx <%@ Page Language="C#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" > <head id="Head1" runat="server">

   <title>Show LookupExpressionBuilder</title>

</head> <body>

   <form id="form1" runat="server">
   <asp:Literal ID="Literal1"
       Text="<%$ lookup:WelcomeMessage %>"
       runat="Server" />
   </form>

</body> </html></source>