ASP.NET:テキストボックスの最大長をHTMLのクラス定数にバインド

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

  •  05-07-2019
  •  | 
  •  

質問

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

役に立ちましたか?

解決

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

<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出力。

他のヒント

このようなことでできるはずだと思う

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

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

scroll top