$MyExpression: Argument, aneb jak na custom expressions (ExpressionBuilder)

Jistě jste si v ASP.NET 2.0 všimli nové vlastnosti, tedy používání expressions v markup-kódu. Vestavěny jsou tyto:

<%$ ConnectionStrings: Name %>
<%$ Resources: Glossary, Key %>
<%$ AppSettings: Key %>

…a my si ukážeme, jak lze jednoduše přidávat vlastní (uvádím pouze primitivní příklad, který má ukázat, že to jde, a kudy na to).

Vše je to v podstatě o tom, že vytvoříme třídu odvozenou od abstraktní báze ExpressionBuilder a implementujeme metodu GetCodeExpression(…) nebo metodu EvaluateExpression(…). Metda EvaluateExpression() vrací vyhodnocený výraz, zatímco metoda GetCodeExpression() vrací kód, který se má použít v přiřazení do property při kompilaci ASPX stránky.

Abychom vytvořený expression-builder použili v našem web, musíme ho ještě přihlásit ve web.configu.

Jak by tedy mohla taková nejjednoduší třída pro expression vypadat:

namespace MyNamespace
{
   [ExpressionPrefix( "MyExpression" )]
   public class MyExpressionBuilder : System.Web.Compilation.ExpressionBuilder
   {
      public override CodeExpression GetCodeExpression(
         BoundPropertyEntry entry,
         object parsedData,
         ExpressionBuilderContext context)
     {
         return new CodeSnippetExpression(entry.Expression);
     }
   }
}

ve web.config pak zavedeme takto:

<compilation debug="true">
      <expressionBuilders>
          <add expressionPrefix="MyExpression" type="Namespace.MyExpressionBuilder, MyAssembly"/>
      </expressionBuilders>
  </compilation>

a v kódu pak použijeme třeba takto:

<asp:Literal Text="<%$ MyExpression: MyClass.MyConst %>" runat="server" /> 
<asp:TextBox ID="PasswordTB" MaxLength="<%$ MyExpression: Uzivatel.Properties.Password.MaximumLength %>" runat="server" />
<asp:RegularExpressionValidator ValidationExpression=<%$ MyExpression: MyRegexPatterns.EmailStrict %>" ... />

Důležité je zdůrznit, že MyExpression v této podobě nedělá nic jiného, než že ASP.NET-compileru dosazuje do míst, kde máme MyExpression použit, příšlušný kód. Můžeme tedy postavit naprosto libovolný syntakticky korektní kus kódu, který je compileru předhozen za přiřazovací rovnítko obdobně jako by se jednalo o makro známé z jiných programovacích platforem, např.:

@__ctrl.MaxLength = ((int)(Uzivatel.Properties.Password.MaximumLength));

Napsat komentář

Vyplňte detaily níže nebo klikněte na ikonu pro přihlášení:

WordPress.com Logo

Komentujete pomocí vašeho WordPress.com účtu. Log Out / Změnit )

Twitter picture

Komentujete pomocí vašeho Twitter účtu. Log Out / Změnit )

Facebook photo

Komentujete pomocí vašeho Facebook účtu. Log Out / Změnit )

Google+ photo

Komentujete pomocí vašeho Google+ účtu. Log Out / Změnit )

Připojování k %s