문제

웹 디자이너가 작성중인 ASP.NET 페이지의 데이터베이스 필드에 대한 메타 데이터를 사용할 수 있도록 노력하고 있습니다. 가장 분명한 것은 다음과 같습니다.

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

필요한 모든 메타 데이터는 클래스 객체에 저장되며 공개 정적 특성으로 인해 액세스 할 수 있습니다.

이것의 이점은 그들이 값을 설정할 수 있다는 것입니다.

ㅏ) 그들이 알고 있거나 돌보지 않고 변경 될 수 있습니다
비) 코딩 노력이 거의없이 사용자 경험을 향상시킵니다

그리고 그들에게 가치가 무엇인지 또는 어디에서 왔는지 걱정하지 않아도됩니다. 이는 주로 자동으로 바인딩 제어에 사용됩니다. 즉, 개발자 상호 작용이 거의 없거나 전혀 추가되지 않은 IE.

이 질문은 매우 유사합니다 내 이전 질문 중 하나 지금은 훌륭하게 작동합니다 (그러나 WPF / XAML에있었습니다).

이 질문의 주요 요점은 가능한 한 이것에 대한 개발자 요구 사항이 거의 없다는 것입니다. 이상적으로는 일부가있을 것입니다. <%# Constant.Value %> 직접 사용할 수있는 유형 구문 Maxlength="" ASP의 속성 : 텍스트 상자 제어는 페이지/UserControl에 코드를 추가 할 필요가 없음을 의미합니다.

나는 그것이 불가능하다고 느낀다. 그러나 나는 누군가가 나를 잘못 증명하는 것을 좋아한다.

고마워

도움이 되었습니까?

해결책

데이터 바인딩 표현식을 사용할 수 있습니다.

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

하지만, 그것은 데이터 컨트롤에 있어야합니다. 리피터 나 공연이 아닌 경우 페이지 라이프 사이클의 어느 시점에서 Container.databind ()를 호출해야합니다.

또는, 당신은 an을 만들 수 있습니다 발현 빌더 다음과 같은 구문을 허용합니다.

<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%>" />

그러나 나의 유일한 관심사는 이것이 실제로 의미가 없다는 것입니다. 상수가 .cs 파일에 저장되어 새로운 상수 값이 UI에 반영되도록 변경하기 위해 사이트를 다시 컴파일해야합니다. .aspx 페이지에서 전체 코드베이스를 다시 컴파일 할 필요없이 쉽게 변경할 수있는 하드 코딩 된 값을 갖는 것이 더 쉬울 수 있다고 생각합니다. 그래도 문제를 이해하지 못할 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top