ASP.Net Expression Builders. Частина 1, Різне, Програмування, статті

У першій частині цієї статті я хочу описати маловідомий і практично не використовуваний трюк в ASP.Net.


Примітка: Це перша частина статті про Expressions Builders. Зверніть увагу, що є і друга частина.


Мова піде про механізм розширення можливостей інлайн-розмітки у вигляді декларативних висловів <% $ ExpressionPrefix: ExpressionKey%>. Можливість використання таких виразів надається механізмом під назвою Expression Builders.


<asp:Literal runat=”server” Text=”<%$ ExpressionPrefix: ExpressionKey %>” />


Кожен вираз складається з префікса ExpressionPrefix і ключового елемента ExpressionKey. За префіксу визначається відповідний Expression Builder, який відповідає за обчислення значення виразу по ключу ExpressionKey.


Суть роботи Expression Builders: вираз парсити і по префіксу шукається раніше зареєстрований билдер, який потім генерує код для отримання значення цього виразу на етапі виконання.


Стандартні білдер


За замовчуванням, в ASP.Net зареєстровано три набори ExpressionBuilder.



  1. <%$ ConnectionStrings: ConnectionStringName %>,
  2. <%$ AppSettings: AppSettingKey %>,
  3. <%$ Resources: ResourceFileName, ResourceKey %>.

Як, власне, можна зрозуміти з їх префіксів, вони займаються генерацією коду для підстановки значень з Web.config і глобальних ресурсів програми.


Примітка: Побачити, на власні очі, їх реєстрацію можна в файлі [% SystemRoot% Microsoft.NETFrameworkv2.0.50727CONFIGWeb.config] і далі шукаємо секції [configuration / system.web / compilation / expressionBuilders]


Протестуємо їх роботу:


web.config:


<?xml version=”1.0″?>


<configuration>


    <appSettings>


        <add key=”MyAppSetting” value=”My AppSetting value from web.config”/>


    </appSettings>


    <connectionStrings>


        <add name=”MyConnectionString” connectionString=”Server=.SqlExpress;Database=MyDatabase;Trusting_Connection=False”/>


    </connectionStrings>


</configuration>


App_GlobalResourcesMyResources.resx


<?xml version=”1.0″ encoding=”utf-8″?>


<root>


    <!– Removed unnecessary details –>


    <data name=”MyResourceKey” xml:space=”preserve”>


        <value>Some string from resource</value>


    </data>


</root>


default.aspx:


<%@ Page Language=”C#” AutoEventWireup=”true” CodeBehind=”Default.aspx.cs” Inherits=”Home.Andir.Examples.DefaultPage” %>


<!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 runat=”server”>


    <title>ASP.Net Expression Builder Test</title>


</head>


<body>


    <h1>ASP.Net Expression Builder Test</h1>


    <table class=borderall cellpadding=”3″ cellspacing=”0″>


        <col style=”color: DarkGreen” align=”left” />


        <tr>


            <th>$AppSettings</th>


            <td><asp:Label runat=”server” Text=”<%$ AppSettings: MyAppSetting %>” /></td>


        </tr>


        <tr>


            <th>$ConnectionStrings</th>


            <td><asp:Label runat=”server” Text=”<%$ ConnectionStrings: MyConnectionString %>” /></td>


        </tr>


        <tr>


            <th>$Resources</th>


            <td><asp:Label runat=”server” Text=”<%$ Resources: MyResources, MyResourceKey %>” /></td>


        </tr>


    </table>


</body>


</html>


Запускаємо і дивимося результат:



Скріншот: Результат виконання вбудованих Expression Builders


Як бачимо, всі значення з файлу конфігурації і глобальних ресурсів вивелися на екран.


Реалізуємо свій билдер


Як уже було згадано, механізм генерації коду “Expression Builders” є розширюваним і можна реалізувати власний вислів. Для цього потрібно створити спадкоємець абстрактного класу ExpressionBuilder і реалізувати метод GetCodeExpression. Цей метод повертає свій результат у вигляді CodeDom Expression.


Реалізуємо примітивний билдер, який перевертає дзеркально свій аргумент.


ReverseExpressionBuilder.cs


using System.CodeDom;


using System.Linq;


using System.Web.Compilation;


using System.Web.UI;


namespace Home.Andir.Examples


{


    public class ReverseExpressionBuilder : ExpressionBuilder


    {


        public override CodeExpression GetCodeExpression(


            BoundPropertyEntry entry,


            object parsedData,


            ExpressionBuilderContext context)


        {


            string key = entry.Expression;


            return new CodePrimitiveExpression(


                ReverseString(key)


                );


        }


        private static string ReverseString(string key)


        {


            return new string(key.ToCharArray().Reverse().ToArray());


        }


    }


}


Після того, як реалізували свій ExpressionBuilder необхідно зареєструвати новий вираз і пов’язати з ним префікс. Робиться це в файлі конфігурації.


Web.config 


<?xml version=”1.0″?>


<configuration>


    <system.web>


        <compilation debug=”true”>


            <expressionBuilders>


                <add expressionPrefix=”ReverseExpression”


                    type=”Home.Andir.Examples.ReverseExpressionBuilder”


                    />


            </expressionBuilders>


        </compilation>


    </system.web>


</configuration>


Після реєстрації префікса, вираз можна використовувати в розмітці ASP.Net.


TestExpression.aspx


<%@ Page Language=”C#” AutoEventWireup=”true” CodeBehind=”TestExpression.aspx.cs” Inherits=”Home.Andir.Examples.TestExpressionPage” %>


<!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 runat=”server”>


    <title>ASP.Net Custom Expression Builder Test</title>


</head>


<body>


    <h1>ASP.Net Custom Expression Builder Test</h1>


    <table class=borderall cellpadding=”3″ cellspacing=”0″>


        <col style=”color: DarkGreen” align=”left” />


        <tr>


            <th>$ReverseExpression</th>



Скріншот: Результат виконання ReverseExpressionBuilder


Як видно на скріншоті, наше вираз успішно відпрацювала.


Залишилося тільки подивитися як це працює зсередини і для цього заглянемо в результат компіляції сторінки TestExpression.aspx (несуттєві деталі викинуті).


Примітка: Результати компіляції сторінок ASP.Net завжди можна знайти в папці [% SystemRoot% Microsoft.NETFrameworkv2.0.50727Temporary ASP.NET Files].


//——————————————————————————


// <auto-generated>


//     This code was generated by a tool.


//     Runtime Version:2.0.50727.3053


//


//     Changes to this file may cause incorrect behavior and will be lost if


//     the code is regenerated.


// </auto-generated>


//——————————————————————————


namespace ASP


{


    [System.Runtime.CompilerServices.CompilerGlobalScopeAttribute()]


    public class testexpression_aspx : global::Home.Andir.Examples.TestExpressionPage, System.Web.SessionState.IRequiresSessionState, System.Web.IHttpHandler


    {


        // details skipped …


        [System.Diagnostics.DebuggerNonUserCodeAttribute()]


        private global::System.Web.UI.WebControls.Label @__BuildControl__control4()


        {


            global::System.Web.UI.WebControls.Label @__ctrl;


            @__ctrl = new global::System.Web.UI.WebControls.Label();


            @__ctrl.ApplyStyleSheetSkin(this);


@ __ctrl.Text = System.Convert.ToString (“! Назаф ТиДиСи едг, ьтанз теалеж кінтохо йиджаК”, System.Globalization.CultureInfo.CurrentCulture);


            return @__ctrl;


        }


        [System.Diagnostics.DebuggerNonUserCodeAttribute()]


        public override void ProcessRequest(System.Web.HttpContext context)


        {


            base.ProcessRequest(context);


        }


    }


}


Тобто в результаті парсинга сторінки, в згенерований код автоматично був вбудований результат виконання ReverseExpressionBuilder.GetCodeExpression(…).

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*