2

我试图让我的网页设计师在他们正在创建的 asp.net 页面中使用我们拥有的关于数据库字段的元数据。最明显的一个如下:

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

所有必需的元数据都存储在我们的类对象中,并且由于其公共静态特性而可以访问。

这样做的好处是他们可以设置的值

a)可能会在他们不知情或不关心的情况下发生变化
b)只需很少的编码工作即可改善用户体验

所有没有它们的人都需要担心价值是什么或它来自哪里。这将主要用于自动绑定控件 - 即添加很少或没有开发人员交互的控件。

这个问题与我之前的一个问题非常相似,现在效果很好(但那是在 WPF / XAML 中)。

这个问题的要点是我希望尽可能少的开发人员对此的要求 - 理想情况下,会有一些<%# Constant.Value %>类型语法可以直接在Maxlength=""asp:Textbox 控件的属性中使用,这意味着不需要将代码添加到页面/用户控件。

我觉得这是不可能的,但我希望有人能证明我错了。

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 回答