簡體   English   中英

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

[英]Using a const string as ID for a ASP.net Webforms Control

您知道,如果您正在使用中繼器控件,就無法以通用方式訪問控件(據我所知)。 因此,在大多數情況下,我們嘗試使用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 ,並使它們成為資源而不是常量。

你可以試試

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM