Frage

Ich versuche, meine Web-Designer zu ermöglichen, die Metadaten wir über Datenbankfelder in den asp.net Seiten verwenden müssen sie schaffen. Die offensichtlichste ist wie folgt:

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

Alle erforderlichen Metadaten in unserer Klasse Objekte gespeichert und zugänglich ist aufgrund seiner öffentlichen statischer Natur.

Der Vorteil wäre, dass sie Werte einstellen, die

a) können sich ändern, ohne dass sie bewusst oder Pflege
sein b) verbessert die Benutzererfahrung mit sehr wenig Programmieraufwand

und das alles ohne sie Sorge um benötigen zu haben, was der Wert ist, oder wenn sie kommen. Dies wird in erster Linie für automatisch gebunden Kontrollen verwendet werden - das heißt diejenigen, die mit wenig oder keinem Entwickler Interaktion zugesetzt werden.

Diese Frage ist sehr ähnlich href="https://stackoverflow.com/questions/232986/xaml-binding-textbox-maxlength-to-class-constant"> Einer meiner früheren Fragen zum die jetzt funktioniert wunderbar (aber das war in WPF / XAML).

Der Hauptpunkt dieser Frage ist, dass ich auf diesem möglichst wenig Entwickler Anforderung will - Im Idealfall würde es einige <%# Constant.Value %> Typ Syntax sein, die innerhalb des Maxlength="" Attributs der asp direkt verwendet werden könnten: Textbox Steuer was bedeutet, dass keine Code Bedürfnisse zu einer Seite / Usercontrol überhaupt werden.

Ich habe das Gefühl, es nicht möglich ist, aber ich würde jemanden lieben, mich falsch zu beweisen.

Ta

War es hilfreich?

Lösung

Sie können eine Datenbindung Ausdruck verwenden:

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

und , dass es in einer Databound Kontrolle sein erfordert. Wenn es nicht in einem Repeater, etc. zu jagen ist, müssen Sie Container.DataBind () zu einem bestimmten Zeitpunkt in der Seitenlebenszyklus nennen.

Alternativ können Sie erstellen ein Expression die Syntax erlauben würde, wie zum Beispiel:

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

Hier ist eine Probe, die aus einem einzigen statischen Wörterbuch ziehen werden:

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];
   }
}

Sie würden registrieren diese in web.config:

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

Und es in einer ASPX-Seite aufrufen:

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

Welche sollte produzieren:

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

in der HTML-Ausgabe.

Andere Tipps

Ich denke, man sollte es in der Lage sein zu tun, mit so etwas wie diesem

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

Aber meine einzige Sorge ist, dass dies wirklich nicht viel Sinn machen. Wenn die Konstante in einer CS-Datei gespeichert, um auf eine Änderung vornehmen, dass der neue konstante Wert verursachen würde in der Benutzeroberfläche reflektiert werden würden Sie die Website neu kompilieren müssen. Ich denke, dass es einfacher sein kann, nur einen harten codierten Wert in der ASPX-Seite zu haben, die einfach ohne die Notwendigkeit geändert werden können die gesamte Codebasis neu zu kompilieren. Vielleicht wenn ich nicht das Problem zu verstehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top