2008-10-29 7 views
2

Je tente d'autoriser mes concepteurs Web à utiliser les métadonnées que nous avons sur les champs de base de données dans les pages asp.net qu'ils sont en train de créer. La plus évidente est la suivante:ASP.NET: Liaison de la zone de texte maxlength à la constante Class en HTML

<asp:TextBox runat="server" id="txTextBox" MaxLength="<Value From Metadata here>" ... /> 

Toutes les métadonnées requises sont stockées dans nos objets de classe et est accessible en raison de sa nature statique public.

L'avantage de ce serait qu'ils peuvent définir des valeurs qui

a) peut changer sans qu'ils soient conscients ou soins
b) améliorer l'expérience utilisateur avec très peu d'effort de codage

et tout sans les avoir besoin de s'inquiéter de ce que la valeur est ou d'où il vient. Cela sera principalement utilisé pour les contrôles liés automatiquement - c'est-à-dire ceux qui sont ajoutés avec peu ou pas d'interaction du développeur.

Cette question est très similaire à One of my previous questions qui fonctionne maintenant à merveille (mais c'était dans WPF/XAML). Le point principal de cette question est que je veux aussi peu de développeur que possible - Idéalement, il y aurait une syntaxe de type <%# Constant.Value %> qui pourrait être utilisée directement dans l'attribut Maxlength="" du contrôle asp: Textbox, ce qui signifie qu'aucun code doit être ajouté à une page/usercontrol à tous. J'ai le sentiment que ce n'est pas possible, mais j'aimerais que quelqu'un me prouve que je me trompe.

Ta

Répondre

1

Vous pouvez utiliser une expression de liaison de données:

<asp:TextBox MaxLength="<%# Constant.Value %>" /> 

mais, qui exige qu'il soit dans un contrôle lié aux données. Si ce n'est pas dans un répéteur ou quelque chose, vous aurez besoin d'appeler Container.DataBind() à un moment donné dans le cycle de vie de la page.

Sinon, vous pouvez créer une ExpressionBuilder qui permettrait une syntaxe telle que:

<asp:TextBox MaxLength="<%$ Constants:Value %>" /> 

Voici un exemple qui va tirer d'un seul dictionnaire statique:

using System; 
using System.Web.UI; 
using System.Web.Compilation; 
using System.CodeDom; 
using System.Collections.Generic; 

class ConstantsExpressionBuilder : ExpressionBuilder { 
    private static readonly Dictionary<string, object> Values = 
     new Dictionary<string, object>() { 
     { "Value1", 12 }, 
     { "Value2", false }, 
     { "Value3", "this is a test" } 
     }; 

    public override bool SupportsEvaluate { get { return true; } } 

    public override object EvaluateExpression(object target, BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context) { 
     string key = entry.Expression.Trim(); 
     return GetValue(key); 
    } 

    public override CodeExpression GetCodeExpression(BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context) { 
     CodePrimitiveExpression keyExpression = new CodePrimitiveExpression(entry.Expression.Trim()); 
     return new CodeMethodInvokeExpression(this.GetType(), "GetValue", new CodeExpression[] { keyExpression });  
    } 

    public static object GetValue(string key) { 
     return Values[key]; 
    } 
} 

Vous seriez Enregistrer ce dans le web.config:

<system.web> 
    <compilation> 
     <expressionBuilders> 
    <add expressionPrefix="Constants" type="ConstantsExpressionBuilder" /> 
     </expressionBuilders> 
    </compilation> 
</system.web> 

et l'appeler dans une page ASPX:

<asp:Textbox runat="server" MaxLength="<%$ Constants:Value1 %>" ReadOnly="<%$ Constants:Value2 %>" Text="<%$ Constants:Value3 %>" /> 

qui devrait produire:

<input type="text" maxlength="12" readonly="false" value="this is a test" /> 

dans la sortie HTML.

+0

Wow, je n'avais jamais entendu parler d'ExpressionBuilders auparavant. On dirait qu'ils pourraient être incroyablement pratique. – Ady

0

Je pense que vous devriez être en mesure de le faire avec quelque chose comme ça

<asp:TextBox runat="server" id="txTextBox" MaxLength="<%=Constants.SomeValue%>" /> 

Mais mon seul souci est que cela ne fait pas vraiment beaucoup de sens. Si la constante est stockée dans un fichier .cs afin d'effectuer une modification qui entraînerait la répercussion de la nouvelle valeur constante dans l'interface utilisateur, vous devrez recompiler le site. Je pense qu'il peut être plus facile d'avoir une valeur codée en dur dans la page .aspx qui peut être changée facilement sans avoir besoin de recompiler toute la base de code. Peut-être que je ne comprends pas le problème.

+0

<%= %> ne fonctionnera pas dans les propriétés des balises de serveur. Vous obtiendrez une erreur de compilation. – Ady

+0

L'idée est que le site peut/ne peut pas être recompilé en coulisses à plusieurs reprises, souvent en raison de changements de schéma de base de données. Je veux que l'interface utilisateur (c'est-à-dire le code HTML dans cette instance) reflète le code derrière les valeurs sans avoir à coder en dur. – Ash