ASP.NET Expressions [1] sind eine deklarative Möglichkeit Controleigenschaften mit Informationen zu versehen die zur Laufzeit erstellt werden. Standardmässig werden in ASP.NET 2.0 drei Expression Builders mitgeliefert:
AppSettingsExpressionBuilder
ConnectionStringsExpressionBuilder
ResourceExpressionBuilder
Die generelle Syntax sieht dabei folgendermassen aus:
<%$ expressionPrefix: expressionValue %>
Um z.B. in einem Literal ein ApplicationSetting aus der Web.Config zu verwenden, wird so bewerkstelligt:
---web.config---
<appSettings>
<add key="copyright" value="(c)Copyright 2004 Northwind Traders"/>
</appSettings>
---webform---
<asp:Literal runat="server" text="<%$ AppSettings: copyright %>"/>
Für Connectionstrings aus der Web.Config läuft es analog:
---web.config---
<configuration>
<connectionStrings>
<add name="NorthwindConnectionString1"
connectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;"
providerName="System.Data.SqlClient" />
</connectionStrings>
<!-- additional settings -->
</configuration>
---webform---
<asp:SqlDataSource ID="SqlDataSource1" Runat="server"
SelectCommand="SELECT * FROM [Employees]"
ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString1 %>">
</asp:SqlDataSource>
Der ResourceExpressionBuilder wird zum lokalisieren von Inhalten verwendet und bezieht Werte aus entsprechenden Resource-Dateien (.resx). Liegen im Ordner App_GlobalResources z.B. die Resource-Dateien Messages.resx, Messages.en.resx und Message.de.resx so kann man folgendermassen auf den Text in der jeweiligen Sprache zugreifen:
---webform---
<asp:Label id="label1" runat="server" text="<%$ Resources: Messages, ThankYouLabel %>" />
In der Resx-Datei Messages muss dazu ein Eintrag mit dem Key "ThankYouLabel" vorhanden sein. Die Message.resx-Datei ist die neutrale Resource, die einen Fallback ermöglicht, falls keine explizite Culture gesetzt wurde oder beim neuen "auto"-Feature die Einstellung des User-Browsers verwendet wurde und keine entsprechende xx-xx.resx-Datei für diese Culture vorhanden ist.
Das interessanteste an den ExpressionBuilders dürfte aber die Möglichkeit sein, relativ einfach eigene zu erstellen [2]:
Dazu muss nur die Methode GetCodeExpression im ExpressionBuilder überschrieben werden:
---VersionExpressionBuilder.cs in App_Code---
using System;
using System.Web.UI;
using System.Web.Compilation;
using System.CodeDom;
public class VersionExpressionBuilder : ExpressionBuilder
{
public override CodeExpression GetCodeExpression(
BoundPropertyEntry entry, object parsedData,
ExpressionBuilderContext context)
{
string param = entry.Expression;
if (String.Compare(param, "All", true) == 0)
return new CodePrimitiveExpression
(String.Format("{0}.{1}.{2}.{3}",
Environment.Version.Major,
Environment.Version.Minor,
Environment.Version.Build,
Environment.Version.Revision));
else if (String.Compare(param, "MajorMinor", true) == 0)
return new CodePrimitiveExpression
(String.Format("{0}.{1}",
Environment.Version.Major,
Environment.Version.Minor));
else
throw new InvalidOperationException
("Use $ Version:All or $ Version:MajorMinor");
}
}
und der neue CustomExpressionBuilder in der Web.Config eingetragen werden:
<!-- From Web.config -->
<compilation>
<expressionBuilders>
<add expressionPrefix="Version" type="VersionExpressionBuilder"/>
</expressionBuilders>
</compilation>
dann kann der neue Ausdruck einfach verwendet werden:
---webform---
<asp:Literal Text='<%$ Version:MajorMinor %>' Runat="server" />
<asp:Literal Text='<%$ Version:All %>' Runat="server" />
Damit man auch in VS2005 eine Designer-Unterstützung erhält muss man in der CustomBuilderKlasse noch enstprechende Klassen für System.Web.UI.Design.ExpressionEditor und ExpressionEditorSheet überschreiben, dann sieht das Ganze folgendermassen aus:


Codebeispiele hierzu finden sich bei ControlBuilderFaq [3] und bei Fredrik Normen´s Blog [4][5]. Wichtig hierbei ist die System.Design.dll (assembly) dem Projekt als Referenz hinzuzufügen, sonst hagelt es Fehlermeldungen, die "using System.Web.UI.Design;" Anweisung für den Namespace alleine reicht nicht aus!
[1] ASP.NET Expressions Overview
[2] Wicked Code: Custom Expression Builders
[3] Using expression builders to simplify pages
[4] How to build an Expression builder
[5] More about building an ExpressionBuilder
Geschrieben am ,