[英]How can i access a server side control from asp.net code behind file using reflection?
[英]how can I wrap a control with a div from the code behind in asp.net?
是否可以添加可以從后面包裝控件的div標簽? 我想向我的函數發送一個控件列表,並讓它動態地在每個控件周圍添加一個div,以便每個控件都在自己的div內。
示例:html:
...
<p> some text</p>
Name: <asp:textbox id="txtName" runat="server" />
...
函數應該可以使標記看起來像這樣-
...
<p> some text</p>
Name: <div id="divName" runat="server"><asp:textbox id="txtName" runat="server" /></div>
...
是的,並且有多種方法可以做到這一點。
推薦的解決方案:創建自定義控件
您可以輕松創建一個自定義控件,該控件擴展了System.Web.UI.WebControls.TextBox
並覆蓋了Render
方法為您編寫標記。 這為您提供了呈現控件的最大靈活性。 本示例使用base.Render()
呈現TextBox
本身,但通過直接HtmlTextWriter
來將其包裝在DIV
。 這樣做的主要好處是,與其他任何服務器控件一樣,您的自定義控件將在后面的代碼中可用,並且您可以在.aspx / .ascx文件中聲明它。
以機智:
public class WrappedTextBox : System.Web.UI.WebControls.TextBox
{
protected override void Render(HtmlTextWriter writer)
{
writer.Write("<div id=\"div{0}\" runat=\"server\">", this.ID.Replace("txt", String.Empty));
base.Render(writer);
writer.WriteEndTag("div");
}
}
要在ASPX頁面中使用控件,請首先Register
控件的名稱空間:
<%@ Register Assembly="WebApplication1" TagPrefix="cc" Namespace="WebApplication1" %>
然后將控件添加到表單中,如下所示:
<cc:WrappedTextBox ID="txtName" runat="server" Text="Wrapped!" />
cc
只是我選擇的任意前綴,但是您可以自己組成! (“ cc
代表“ cc
”)
請注意,在div
輸出中可能不需要runat=\\"server\\"
(盡管我想您可能正在編寫生成ASPX內容的代碼)。 runat="server"
只是告訴ASP.NET您希望它成為服務器控件,但是在這種情況下,您的WrappedTextBox
是服務器控件。 還要注意,這不一定是最佳實踐示例。.我通常不會替換txt
,而是將自定義屬性用於div ID。 (但是此示例將提供請求的輸出。)
替代解決方案:深度優先搜索和修改控制樹
protected void Page_Load(object sender, EventArgs e)
{
DeepControlSearch(Page);
}
private void DeepControlSearch(Control control)
{
if (control.HasControls())
{
for (int c = control.Controls.Count - 1; c > -1; c--)
{
DeepControlSearch(control.Controls[c]);
}
}
if (control is TextBox)
{
WrapTextBox((TextBox)control);
}
}
private void WrapTextBox(TextBox textBox)
{
System.Web.UI.HtmlControls.HtmlGenericControl div = new System.Web.UI.HtmlControls.HtmlGenericControl("div");
div.ID = String.Format("div{0}", textBox.ID.Replace("txt", String.Empty));
div.Attributes["runat"] = "server";
Control parent = textBox.Parent;
parent.Controls.Remove(textBox);
div.Controls.Add(textBox);
parent.Controls.Add(div);
}
這種方法的好處是您不必創建自定義控件(這需要一些前期工作,但通常是值得的投資,因為您可以在任何ASP.NET項目中重用它們)。 HtmlGenericControl
可以像其他任何服務器控件一樣進行操作,但是它是動態的,因此,如果要在PostBack
上訪問它,則必須位於ViewState
(除非您希望使用oldskool的方式進行操作,並循環訪問已發布的Form
元素以獲取值)來自動態控件)。
不確定我會推薦第二種方法; 這確實是自定義控件的用途。
替代解決方案#2:發出JavaScript(使jQuery非常容易)包裝控件
您可以使用ClientScript.RegisterStartupScript()
發出一些JavaScript或jQuery來執行此操作,例如:
ClientScript.RegisterStartupScript(
this.GetType(),
"wrap textboxes",
"$(document).ready(function(){$('input:text').each(function(){$(this).wrap('<div id=\"div' + this.id.replace('txt', '') + '\"></div>');});});",
true);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.