2008-10-29 6 views
2

웹 디자이너가 작성중인 asp.net 페이지에서 데이터베이스 필드에 대한 메타 데이터를 사용할 수 있도록 시도하고 있습니다. 가장 명백한 것은 다음과 같습니다 :ASP.NET : textbox maxlength를 HTML의 클래스 상수로 바인딩

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

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

이것의 이점은 매우 적은 코딩 노력

를 사용하여 사용자 경험을 향상

가) 그들이 인식이나 배려
나없이 변경 될 수 있습니다 값)을 설정할 수있는 것

과 그 모두가 가치가 무엇인지 또는 그것이 어디서 왔는지에 대해 걱정할 필요가 없습니다. 주로 자동 바인딩 된 컨트롤에 사용됩니다. 즉, 개발자 상호 작용이 거의 또는 전혀 추가되지 않은 컨트롤입니다.

이 질문은 One of my previous questions과 매우 유사합니다 (이제는 WPF/XAML을 사용 했음).

이 질문의 주요 요점은 가능하면 개발자의 요구 사항을 최대한 낮추고 싶다는 것입니다. 이상적으로는 Maxlength=""의 asp : Textbox 컨트롤에서 직접 사용할 수있는 <%# Constant.Value %> 형식 구문이있을 것입니다. 페이지/사용자 정의 컨트롤에 전혀 추가해야합니다.

나는 그것이 가능하지 않다고 느끼지만, 누군가 나를 사랑한다는 것을 잘못 알고있다.

따은

답변

1

당신은 데이터 바인딩 식을 사용할 수 있습니다. 리피터 또는 그 외의 경우 페이지 라이프 사이클의 어느 시점에서 Container.DataBind()를 호출해야합니다.

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

당신이 등록 것 : 여기

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

는 단일 정적 사전에서 끌어 것이다 샘플입니다 :

다른 방법으로는 구문과 같은 허용 것이다 ExpressionBuilder를 만들 수 있습니다 웹.설정 : ASPX 페이지에서

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

그리고 전화 :

<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 출력에.

+0

와우, 전에는 ExpressionBuilder에 대해 들어 본 적이 없었습니다. 믿을 수 없을만큼 편리 할 것 같은이 소리. – Ady

0

난 당신이

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

같은 것을 함께 할 수 있어야한다고 생각하지만 내 유일한 관심사는이 정말 많은 이해가되지 않는다는 것입니다. 새로운 상수 값이 UI에 반영되도록 변경하기 위해 상수가 .cs 파일에 저장되는 경우 사이트를 다시 컴파일해야합니다. .aspx 페이지에서 하드 코드 된 값을 갖는 것이 더 쉬울 수도 있다고 생각합니다.이 값은 전체 코드베이스를 다시 컴파일 할 필요없이 쉽게 변경할 수 있습니다. 어쩌면 나는 문제를 이해하지 못할 것이다.

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

하지만, 즉 데이터 바인딩 컨트롤에 있어야 할 필요합니다

+0

<%= %>은 서버 태그 속성에서 작동하지 않습니다. 컴파일 오류가 발생합니다. – Ady

+0

아이디어는 데이터베이스 스키마 변경으로 인해 사이트가 여러 번 뒤에서 재 컴파일되거나 재 컴파일되지 않을 수 있다는 것입니다. 아무 것도 하드 코딩하지 않고 코드 뒤에 값을 반영하는 UI (즉,이 인스턴스의 HTML)를 원합니다. – Ash

관련 문제