我试图让我的网页设计师使用我们在他们正在创建的asp.net页面中的数据库字段的元数据。最明显的一个如下:
<asp:TextBox runat="server" id="txTextBox" MaxLength="<Value From Metadata here>" ... />
所有必需的元数据都存储在我们的类对象中,并且由于其公共静态特性而可以访问。
这样做的好处是他们可以设置值
a)可能会在没有他们意识到或关心的情况下发生变化 b)以极少的编码工作量改善用户体验
所有这些都没有让他们担心价值是什么或它来自何处。这将主要用于自动绑定控件 - 即添加很少或没有开发人员交互的控件。
这个问题与One of my previous questions非常相似,现在效果非常好(但是在WPF / XAML中)。
这个问题的要点是我希望尽可能少的开发人员要求 - 理想情况下会有一些<%# Constant.Value %>
类型语法可以直接在asp的Maxlength=""
属性中使用:文本框控件意味着根本不需要将代码添加到页面/用户控件中。
我觉得这是不可能的,但我希望有人证明我错了。
TA
答案 0 :(得分: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输出中。
答案 1 :(得分:0)
我认为你应该能够用这样的东西做到这一点
<asp:TextBox runat="server" id="txTextBox" MaxLength="<%=Constants.SomeValue%>" />
但我唯一担心的是,这并没有多大意义。如果常量存储在.cs文件中,以便进行更改以使新常量值反映在UI中,则必须重新编译该站点。我认为在.aspx页面中拥有一个可以轻松更改的硬编码值可能更容易,而无需重新编译整个代码库。也许我不是在理解这个问题。