簡體   English   中英

具有相同 ID 的 ASP.NET Web 控件

[英]ASP.NET web control with the same ID

在 ASP.NET 頁面上,如果像<asp:Texbox ID="Textbox1">這樣的 ASP.NET 元素出現在多個位置,它們是相同的 Textbox 對象還是具有相同名稱“Textbox1”的不同對象? 如果相同,“為什么不會引起任何沖突?”

例如

<asp:DetailsView 
        ID="DetailsView1" runat="server" AutoGenerateRows="False" CellPadding="4" 
        DataKeyNames="CategoryID" DataSourceID="SqlDataSource1" DefaultMode="Insert" 
        ForeColor="#333333" GridLines="None" Height="50px" Width="125px">
        <AlternatingRowStyle BackColor="White" />
        <CommandRowStyle BackColor="#D1DDF1" Font-Bold="True" />
        <EditRowStyle BackColor="#2461BF" />
        <FieldHeaderStyle BackColor="#DEE8F5" Font-Bold="True" />
        <Fields>
            <asp:TemplateField HeaderText="Name" SortExpression="Name">
                <EditItemTemplate>
                    **<asp:TextBox ID="TextBox1"** runat="server" Text='<%# Bind("Name") %>'></asp:TextBox>
                </EditItemTemplate>
                <InsertItemTemplate>
                    **<asp:TextBox ID="TextBox1"** runat="server" Text='<%# Bind("Name") %>'></asp:TextBox>
                    <span class="style6">
                    <br />
                    <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" 
                        ControlToValidate="TextBox1" Display="Dynamic" 
                        ErrorMessage="RequiredFieldValidator" ValidationGroup="A"></asp:RequiredFieldValidator>
                    </span>
                </InsertItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label1" runat="server" Text='<%# Bind("Name") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:CommandField CancelText="" ShowInsertButton="True" ValidationGroup="A" />
        </Fields>
        <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
        <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
        <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
        <RowStyle BackColor="#EFF3FB" />
    </asp:DetailsView>

我相信您指的是關於數據綁定控件的命名容器 如果您在轉發器中有一個 TextBox,基本上它們會呈現如下:

<input name="Repeater1$ctl00$TextBox1" type="text" value="Text on row" id="Repeater1_ctl00_TextBox1" />
<input name="Repeater1$ctl01$TextBox1" type="text" value="Text on row" id="Repeater1_ctl01_TextBox1" />

根據您的更新。

如果您在GridView或任何其他允許嵌套控件的控件中聲明控件(文本框),則 ASP.NET 引擎實際上會為其創建一個唯一 ID(類似於 ctl00_main_ddlCtrl)。 從 ASP.NET 4.0 開始,您可以控制它創建的 ID,而以前的版本則不能。

這些元素的行為取決於瀏覽器。 在 HTML 規范中要求 ID 必須是唯一的。 因此,即使瀏覽器會接受這樣的頁面,行為也可能有點偏離。 通常,沒有元素會響應非唯一 ID。

您的問題的答案是,它們根本不是您聲明它們的對象。

<asp:Textbox Id="TextBox1">SOMETEXT</asp:textbox>
<asp:Textbox Id="TextBox1">SOMETEXT2</asp:textbox>

它們只是具有相同 id 屬性的 html 標簽。 查看網頁的源代碼,您會看到它們只是呈現為文本 b/c,瀏覽器不知道如何使用標簽。 而不是將它們轉換為輸入。 如果沒有 Runat="server" 標簽,編譯器將不會將它們轉換為帶有生成 Id 標簽的 html,它們也將無法在后面的代碼中訪問。

當您添加 runat="server" 標記時,您將被迫將 Id 屬性更改為唯一名稱 b/c,除非在相同的上下文中,因此不能具有相同的 id。

基本上簡短的回答是,如果您看到<asp:textbox...當您通過瀏覽器查看源代碼時,您沒有正確聲明您的文本框。 相反,您應該看到<input ...

在其他控件內聲明文本框控件,例如 gridview 控件是在包含控件的對象內聲明,即不再在 aspx 頁面對象內聲明。 因此名稱可以相同。

暫無
暫無

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

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