[英]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.