您知道,如果您正在使用 Repeater Controls,您将无法以通用方式访问控件(据我所知)。因此,我们尝试在大多数情况下使用 const 字符串,我们必须在 C# 中使用字符串。
所以我创建了一个包含 const 字符串的类。它们定义中继器内控件的 ID 名称。这使得以比在代码中使用纯字符串更通用的方式访问控件成为可能。示例:
public class FormularRepeaterFieldIDs
{
public const string RubrikLiteral = "BuchungRubrikLiteral";
public const string RubrikDropDownList = "BuchungRubrikList";
public const string RubrikIdHiddenField = "BuchungRubrikIdHidden";
}
它允许这样的访问(当然你可以为此做一个更简单的访问包装器):
Literal rubrikLiteral = (Literal)e.Item.FindControl(TimeExpressHelper.FormularRepeaterFieldIDs.RubrikLiteral);
rubrikLiteral.Visible = false;
现在我也很乐意在 Webforms 前端代码中使用预定义的 ID。目前看起来是这样的:
<asp:Literal ID="BuchungRubrikLiteral" Text='<%#Eval("strRubrik")%>' runat="server" />
有没有可能做出这样的东西?
<asp:Literal ID="<% FormularRepeaterFieldIDs.RubrikLiteral %>" Text='<%#Eval("strRubrik")%>' runat="server" />
最佳答案
您或许可以使用自定义 ExpressionBuilder 来完成这项工作.像这样的东西:
<asp:Literal ID="<%$ Const:FormularRepeaterFieldIDs.BuchungRubrik"
Text='<%#Eval("strRubrik")%>' runat="server" />
使用 Reflection
和/或 CodeSnippetExpression
来读取值的 ExpressionBuilder:
class ConstExpressionBuilder : ExpressionBuilder {
override bool SupportsEvaluate { get { return true; } }
override CodeExpression GetCodeExpression(BoundPropertyEntry entry, ...) {
return new CodeSnippetExpression(entry.Expression);
}
override object EvaluateExpression(BoundPropertyEntry entry, ...) {
var splitExpression = entry.Expression.Split('.');
var fieldName = splitExpression.Last();
var typeName = entry.Expression.Substring(entry.Expression.Length - fieldName.Length - 1);
var type = Type.GetType(typeName);
return type.GetField(fieldName).GetValue(null);
}
}
和一个 web.config 来注册它来处理 Const
前缀:
<expressionBuilders>
<add expressionPrefix="Const" type="ConstExpressionBuilder" />
</expressionBuilders>
或者,您可以利用现有的 ResourceExpressionBuilder ,并使它们成为资源而不是常量。
关于c# - 使用常量字符串作为 ASP.net Webforms 控件的 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11153258/