使用const字符串作为ASP.net Webforms控件的ID

时间:2012-06-22 09:08:55

标签: c# asp.net webforms

您知道如果您正在使用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" />

2 个答案:

答案 0 :(得分:1)

您可以使用自定义ExpressionBuilder进行此操作。类似的东西:

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

使用ExpressionBuilder使用Reflection和/或CodeSnippetExpression来读取值:

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

答案 1 :(得分:0)

你可以尝试

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