ASP.NET: lunghezza massima della casella di testo vincolante alla costante di classe in HTML

StackOverflow https://stackoverflow.com/questions/247369

  •  05-07-2019
  •  | 
  •  

Domanda

Sto tentando di consentire ai miei web designer di utilizzare i metadati che abbiamo sui campi del database nelle pagine asp.net che stanno creando. Il più ovvio è il seguente:

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

Tutti i metadati richiesti sono memorizzati nei nostri oggetti di classe ed è accessibile a causa della sua natura statica pubblica.

Il vantaggio di ciò sarebbe che possono impostare valori quali

a) potrebbe cambiare senza che fossero consapevoli o premurosi
b) migliora l'esperienza dell'utente con pochissimo sforzo di codifica

e tutti senza averli devono preoccuparsi di quale sia il valore o da dove provenga. Questo verrà utilizzato principalmente per i controlli associati automaticamente, ovvero quelli che vengono aggiunti con poca o nessuna interazione con gli sviluppatori.

Questa domanda è molto simile a Una delle mie precedenti domande che ora funziona meravigliosamente (ma era in WPF / XAML).

Il punto principale di questa domanda è che voglio il minor numero possibile di sviluppatori su questo - Idealmente ci sarebbe una sintassi di tipo <%# Constant.Value %> che potrebbe essere usata direttamente all'interno dell'attributo Maxlength="" dell'asp: Significato del controllo Textbox che non è necessario aggiungere alcun codice a una pagina / controllo utente.

Ho la sensazione che non sia possibile, ma vorrei che qualcuno mi dimostrasse di sbagliare.

Ta

È stato utile?

Soluzione

Puoi utilizzare un'espressione di associazione dei dati:

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

ma , che richiede un controllo di banca dati. Se non si trova in un ripetitore o in un altro, è necessario chiamare Container.DataBind () a un certo punto del ciclo di vita della pagina.

In alternativa, puoi creare un ExpressionBuilder che consentirebbe la sintassi come:

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

Ecco un esempio che verrà estratto da un singolo dizionario statico:

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

Lo registreresti in web.config:

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

E chiamalo in una pagina ASPX:

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

Che dovrebbe produrre:

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

nell'output HTML.

Altri suggerimenti

Penso che dovresti essere in grado di farlo con qualcosa del genere

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

Ma la mia unica preoccupazione è che questo non ha molto senso. Se la costante viene archiviata in un file .cs per apportare una modifica che provocherebbe il riflesso del nuovo valore della costante nell'IU, è necessario ricompilare il sito. Penso che potrebbe essere più semplice avere un valore hardcoded nella pagina .aspx che può essere modificato facilmente senza la necessità di ricompilare l'intera base di codice. Forse non capisco il problema però.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top