Question

J'essaie 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 créent. La plus évidente est la suivante:

<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 sont accessibles en raison de leur nature statique publique.

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

a) peut changer sans que vous en soyez conscient ou attentionné
b) améliorer l'expérience utilisateur avec très peu d'effort de codage

et tous, sans les avoir, doivent s'inquiéter de la valeur ou de la provenance. Ceci sera principalement utilisé pour les contrôles liés automatiquement - c’est-à-dire ceux qui sont ajoutés avec peu ou pas d’interaction entre développeurs.

Cette question est très similaire à la une de mes précédentes questions . qui fonctionne maintenant à merveille (mais c'était en WPF / XAML).

Le point essentiel de cette question est que je souhaite que le développeur ait à ce sujet un minimum d'exigences. Idéalement, il devrait exister une syntaxe de type <%# Constant.Value %> pouvant être utilisée directement dans l'attribut Maxlength="" de la signification du contrôle asp: Textbox. qu'aucun code ne doit être ajouté à une page / usercontrol.

J'ai l'impression que ce n'est pas possible, mais j'aimerais que quelqu'un me prouve le contraire.

Ta

Était-ce utile?

La solution

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

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

mais , cela nécessite qu'il soit dans un contrôle databound. S'il ne s'agit pas d'un répéteur, vous devez appeler Container.DataBind () à un moment donné du cycle de vie de la page.

Vous pouvez également créer un ExpressionBuilder qui autoriserait une syntaxe telle que:

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

Voici un exemple extrait d'un dictionnaire statique unique:

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 souhaitez enregistrer ceci dans web.config:

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

Et appelez-le dans une page ASPX:

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

Ce qui devrait produire:

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

dans la sortie HTML.

Autres conseils

Je pense que vous devriez pouvoir le faire avec quelque chose comme ça

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

Mais mon seul souci est que cela n’a pas vraiment de sens. Si la constante est stockée dans un fichier .cs afin d'effectuer une modification qui aurait pour effet de refléter la nouvelle valeur de constante dans l'interface utilisateur, vous devrez recompiler le site. Je pense qu'il est peut-être plus simple d'avoir une valeur codée en dur dans la page .aspx qui peut être modifiée facilement sans qu'il soit nécessaire de recompiler l'intégralité de la base de code. Peut-être que je ne comprends pas le problème cependant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top