HAVIT Knowledge Base

Vývoj webových aplikací, .NET, SQL, návrh
Welcome to HAVIT Knowledge Base Sign in | Join | Help
-
Home Články Forums Obrázky Soubory

ASP.NET

Vývoj webových aplikací ASP.NET

Updated: <%$ 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));

Published 15. února 2007 23:18 by Robert Haken
Filed under:

Comment Notification

If you would like to receive an email when updates are made to this post, please register here

Subscribe to this post's comments using RSS

Comments

 

Zdenda said:

Dík za přínosný článeček. Tohle přesně na asp.net miluju - deklarativní přístup. Nevíte kde se dočíst o konvencích a fungování <% #.... %> těchto zápisů...

Mám namysli např. <cc:control ....... vlastnost='<% #Profile.NejakaVlastnost %>' ... Aby se to vyhodnotilo musím dát cc.DataBind. Je nějaká možnost, jak tyto výrazy rovnou vyhodnotit. (Možná je to nesmyslná otázka ... jsem začátečník)

února 20, 2007 14:59
 

Martin Knotek said:

Ahoj, muzes prepsat event controlu a zde volat databind(). Automaticky to samozrejme nejde.

září 11, 2007 19:03
 

Robert Haken said:

To Zdenda: No ono tento článek popisuje právě způsob, jak udělat <cc:control vlastnost='<%$ Expression: Trida.NejakaVlastnost %>' />, tak, abych nemusel dělat cc.DataBind(). Syntaxe <%# ... %> se konvenčními metodami bez DataBind() neobejde.

září 11, 2007 23:20

What do you think?

(required) 
(optional)
(required) 
Enter the code you see below

Submit