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

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

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

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

a)可能会在没有他们意识到或关心的情况下发生变化 b)以极少的编码工作量改善用户体验

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

此问题与我以前的一个问题非常相似现在效果非常好(但是在WPF / XAML中)。

这个问题的要点是我希望尽可能少的开发人员要求 - 理想情况下会有一些<%# Constant.Value %>类型语法可以直接在asp:Textbox控件含义的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%>" />

但我唯一担心的是,这并没有多大意义。如果常量存储在.cs文件中,以便进行更改以使新常量值反映在UI中,则必须重新编译该站点。我认为在.aspx页面中拥有一个可以轻松更改的硬编码值可能更容易,而无需重新编译整个代码库。也许我不是在理解这个问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top