2

Webデザイナーが、作成しているasp.netページのデータベースフィールドに関するメタデータを使用できるようにしようとしています。最も明白なものは次のとおりです。

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

必要なすべてのメタデータはクラスオブジェクトに格納されており、パブリックな静的な性質のためにアクセスできます。

これの利点は、彼らが値を設定できることです

a )ユーザーが気付かないうちに変更される可能性がある
b)コーディングの労力をほとんどかけずにユーザーエクスペリエンスを向上させる

そして、それらを持たずに、価値が何であるか、またはそれがどこから来たのかを心配する必要はありません。これは主に、自動的にバインドされたコントロール、つまり開発者の操作がほとんどまたはまったくない状態で追加されるコントロールに使用されます。

この質問は、以前の質問の1つと非常によく似ており、現在はうまく機能しています(ただし、これはWPF / XAMLで行われました)。

この質問の主なポイントは、これに関する開発者の要件をできるだけ少なくしたいということです-理想的には、asp:Textboxコントロール<%# Constant.Value %>の属性内で直接使用できるタイプの構文があるためMaxlength=""、コードを追加する必要はありません。ページ/ユーザーコントロール。

それは不可能だと感じていますが、誰かに私が間違っていることを証明してもらいたいです。

Ta

4

2 に答える 2

1

データバインディング式を使用できます。

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

ただし、データバインドされたコントロール内にある必要があります。リピーターなどにない場合は、ページのライフサイクルのある時点でContainer.DataBind()を呼び出す必要があります。

または、次のような構文を許可するExpressionBuilderを作成することもできます。

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

単一の静的辞書から取得するサンプルを次に示します。

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

これをweb.configに登録します。

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

そして、ASPXページでそれを呼び出します。

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

どちらが生成する必要があります:

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

HTML出力で。

于 2008-10-29T16:36:54.477 に答える
0

私はあなたがこのようなものでそれを行うことができるはずだと思います

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

しかし、私の唯一の懸念は、これはあまり意味がないということです。定数が .cs ファイルに格納されている場合、新しい定数値が UI に反映されるような変更を行うために、サイトを再コンパイルする必要があります。コードベース全体を再コンパイルする必要なく、簡単に変更できるハードコードされた値を .aspx ページに設定する方が簡単だと思います。多分私は問題を理解していません。

于 2008-10-29T16:03:56.960 に答える