2

您知道,如果您使用的是中继器控件,则无法以通用方式访问控件(据我所知)。因此,我们尝试在 C# 中必须使用字符串的大多数情况下使用 const 字符串。

所以我用 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" />
4

2 回答 2

1

您可能可以使用自定义ExpressionBuilder来完成这项工作。就像是:

  <asp:Literal ID="<%$ Const:FormularRepeaterFieldIDs.BuchungRubrik" 
     Text='<%#Eval("strRubrik")%>' runat="server" />

使用 ExpressionBuilderReflection和/或 aCodeSnippetExpression来读取值:

  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,并让它们成为资源而不是常量。

于 2012-06-27T08:32:22.243 回答
0

You can try

<div runat="server" id="container">
<% 
   List<string> listOfIds = new List<string>{FormularRepeaterFieldIDs.RubrikLiteral};
   foreach(var i in listOfIds.Count)
   {
      var l = new label();
      l.ID = listOfIds[i];
      container.Controls.Add(l);
   }
%>
</div>
于 2012-06-22T10:52:35.077 回答