簡體   English   中英

我怎樣才能從asp.net后面的代碼中包裝一個帶有div的控件?

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

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