Pregunta

Estoy intentando permitir que mis diseñadores web utilicen los metadatos que tenemos sobre los campos de la base de datos en las páginas asp.net que están creando. La más obvia es la siguiente:

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

Todos los metadatos requeridos se almacenan en nuestros objetos de clase y son accesibles debido a su naturaleza estática pública.

El beneficio de esto sería que pueden establecer valores que

a) puede cambiar sin que se den cuenta o se preocupen
b) mejora la experiencia del usuario con muy poco esfuerzo de codificación

y todo sin tenerlos necesita preocuparse sobre cuál es el valor o de dónde proviene. Esto se utilizará principalmente para controles vinculados automáticamente, es decir, aquellos que se agregan con poca o ninguna interacción del desarrollador.

Esta pregunta es muy similar a Una de mis preguntas anteriores que ahora funciona maravillosamente (pero eso fue en WPF / XAML).

El punto principal de esta pregunta es que quiero tener el menor requerimiento de desarrollador posible: idealmente, habría una sintaxis de tipo <%# Constant.Value %> que podría usarse directamente dentro del atributo Maxlength="" del asp: significado del control del cuadro de texto que no es necesario agregar ningún código a una página / control de usuario.

Tengo la sensación de que no es posible, pero me encantaría que alguien demuestre que estoy equivocado.

Ta

¿Fue útil?

Solución

Puede usar una expresión de enlace de datos:

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

pero , eso requiere que esté en un control de enlace de datos. Si no está en un repetidor o algo así, deberá llamar a Container.DataBind () en algún momento del ciclo de vida de la página.

Alternativamente, puede crear un ExpressionBuilder que permitiría una sintaxis como:

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

Aquí hay una muestra que extraerá de un solo diccionario estático:

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

Deberías registrar esto en web.config:

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

Y llámalo en una página ASPX:

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

Que debería producir:

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

en la salida HTML.

Otros consejos

Creo que deberías poder hacerlo con algo como esto

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

Pero mi única preocupación es que esto realmente no tiene mucho sentido. Si la constante se almacena en un archivo .cs para realizar un cambio que haga que el nuevo valor constante se refleje en la interfaz de usuario, deberá volver a compilar el sitio. Creo que puede ser más fácil tener un valor codificado en la página .aspx que se pueda cambiar fácilmente sin la necesidad de volver a compilar toda la base de código. Tal vez no entiendo el problema sin embargo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top