如何阻止ASP.NET更改ID以使用jQuery

时间:2009-01-31 00:21:25

标签: asp.net jquery ajax

我的网页上有这个标签控件

<asp:Label ID="Label1" runat="server" Text="test"></asp:Label>

当页面呈现控件的id改变为类似

  <span id="ctl00_ContentPlaceHolder1_Label3">test</span>

如何阻止asp.net更改ID以执行像这样的jQuery操作

$('#label1').html(xml);

20 个答案:

答案 0 :(得分:40)

而不是使用此选择器

$('#Label1')

使用这个,基本上你使用的是经典的asp内联服务器端代码。

$('#<%= Label1.ClientID %>')

这将插入生成的任何ID作为文字放置。

如果您希望使用外部文件,那么我建议您在页面上创建一个全局的obj来保存所有客户端ID,然后在外部文件中引用该obj(不理想,但它是一个解决方案)< / p>

var MyClientIDs = {
    Label1 = '<%= Label1.ClientID %>',
    Label2 = '<%= Label2.ClientID %>',
    Textbox1 = '<%= Textbox1.ClientID %>',
    Textbox2 = '<%= Textbox2.ClientID %>'
};

然后在外部文件中,您可以访问Label1,例如:$('#' + MyClientIDs.Label1)

答案 1 :(得分:36)

.NET 4现在可以让您选择ClientIDMode

输入:System.Web.UI.ClientIDMode

一个值,指示如何生成ClientID属性。默认值为Inherit。

  

AutoID ClientID值是通过连接ID值生成的   每个父命名容器的ID值与控件的ID值。在   数据绑定方案,其中控件的多个实例是   渲染时,会在控件前面插入一个递增值   ID值。每个段由下划线字符(_)分隔。   此算法用于早于ASP.NET 4的ASP.NET版本。

     

静态 ClientID值设置为ID属性的值。如果   控件是一个命名容器,控件用作顶部   为其包含的任何控件命名容器的层次结构。

     

可预测此算法用于数据绑定中的控件   控制。 ClientID值是通过连接生成的   具有ID值的父命名容器的ClientID值   控制。如果控件是生成的数据绑定控件   多行,指定的数据字段的值   最后添加ClientIDRowSuffix属性。对于GridView   控制,可以指定多个数据字段。如果   ClientIDRowSuffix属性为空,添加了序号   结束而不是数据字段值。这个数字从零开始   每行增加1。每个部分由一个分隔   下划线字符(_)。

     

继承控件继承其NamingContainer控件的ClientIDMode设置。

答案 2 :(得分:21)

您无法阻止asp.net生成这些ID。这就是事情的方式。

您仍然可以像这样使用jquery:

$('#<%=label1.ClientID %>').html(xml) 

$('[id$=_label1]').html(xml)

答案 3 :(得分:19)

设置ClientIDMode="Static"。这将解决您的问题。

示例:

<asp:Label ID="Label1" ClientIDMode="Static" runat="server" Text="test"></asp:Label>

答案 4 :(得分:16)

如果,您的容器布局永远不会改变,您需要将JavaSctipt / jQuery放在外部文件,您可以在jQuery选择器中使用生成的ID,即

$('#ctl00_ContentPlaceHolder1_Label3').html(xml);

显然,这种方法要求您了解生成的ID将是什么,并且如果您开始更改站点/应用程序构造,则需要谨慎。

否则,您的最佳选项

1。使用内联服务器端代码标记。这种方法的缺点是你不能把你的js代码放在外部文件中 -

$('#<%= Label3.ClientID %>').html(xml);

2。在jQuery中需要使用的每个控件上定义唯一的CSS类,这仍然允许您将js代码放在外部文件中 -

<asp:Label ID="Label3" runat="server" Text="test" CssClass="label3">
</asp:Label>

$('.label3').html(xml);

3. 使用jQuery选择器模式匹配原始ID,这也允许您将js代码放在外部文件中 -

$('[id$=Label3]').html(xml);

此jQuery选择器将选择属性为 id 的所有元素,其值以 Label3 结尾。我可以通过这种方法看到的唯一潜在缺点是,理论上,可能有一个带有ID Label3的Label控件,例如Master页面以及两个内容页面。在此示例中,使用上面的jQuery选择器将匹配所有三个标签,这可能会产生不良后果。

修改

我认为将注意力提升到IDOverride control可能会有所帮助。 Example page can be found here

它允许您指定哪些控件应该在输出的HTML标记中具有其错位ID,并在呈现HTML页面时覆盖.aspx文件中给出的id。我只用一个Master Page和Panels简单地玩了它,但看起来效果很好。使用它,您可以在jQuery选择器中使用原始ID。但是请注意,如果您要在主页面和内容页面中使用相同的ID来控制结果,那么结果是不可预测的。这些页面将组合在一起以呈现一页的HTML。

答案 5 :(得分:7)

简短回答,不要担心使用asp.net ID。在asp.net中,您可以将自己的属性添加到标记:

<asp:TexBox ID="myTBox" runat="server" MyCustomAttr="foo" />

然后在jquery中你可以通过以下方式引用这个元素:

$("input[MyCustomAttr='foo']")

我一直用jQuery做这个。希望它有所帮助。

答案 6 :(得分:6)

您可以拨打课程名称而不是使用ID

例如;

$('.CssClassName'). ...

或者如果您在MasterPage的第一行输入此内容,您的控件ID将无法更改:

ClientIDMode="Static"

例如;

<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="Main_MasterPage" ClientIDMode="Static" %>

答案 7 :(得分:5)

内联代码是正确的方法。但是,这将在ASP.NET 4.0中发生变化。我们花了一些时间添加一个功能,允许完全控制客户端生成的ID。以下是网络上有关此功能的一些资源。

答案 8 :(得分:4)

这里的大多数建议都有效,但jQuery代码的测试结果显示纯ID选择器是迄今为止最快的。我经常使用的那个:

$("[id$=origControlId]")

非常慢,但除非页面有很多控件和大量的jQuery,否则问题不会太明显。

由于将多个类分配给控件是相当轻松的,因此可以为每个类提供与ID匹配的CSSClass。由于它们将是唯一的(您必须观察生成多个控件的转发器类型控件),您可以按类选择。

例如:

<asp:Label ID="Label1" CssClass="Label1 SomeOtherClass" runat="server" Text="test">
</asp:Label>

可以通过以下方式唯一选择:

$(".Label1")

几乎与ID选择一样快。

我从未考虑过这个:

$('#<%= Label1.ClientID %>')

但我要去尝试一下!

答案 9 :(得分:3)

您可以使用ClientID(就像其他人说的那样),但问题在于它无法在外部JavaScript文件中使用。

所以,理想情况下,不是使用ID从jQuery引用它,使用CSS类

<asp:Label ID="Label1" runat="server" Text="test" CssClass="myclass"></asp:Label>

然后你可以像这样引用它:

$(".myclass")

答案 10 :(得分:3)

你必须将控件的ClientID传递给javascript代码(我怀疑Label1被重命名为Label3)

ClientScriptManager.RegisterClientScriptBlock(GetType(), "someKey", 
    "$('#" + Label1.ClientID + "').html(xml);", true);

答案 11 :(得分:2)

这可以通过在呈现控件时将asp.net id替换为原始id来实现。 这非常简单,可以通过创建一组自定义控件来实现。

http://www.bytechaser.com/en/articles/ts8t6k5psp/how-to-display-aspnet-controls-with-clean-id-value.aspx

答案 12 :(得分:2)

您还可以创建一个继承自Label的自定义控件,该控件会覆盖您希望的ID属性。

答案 13 :(得分:2)

您可以将ClientID和UniqueID覆盖为this fella did

/// <summary>
/// Override to force simple IDs all around
/// </summary>

public override string UniqueID
{
    get
    {
        return this.ID;
    }
}

/// <summary>
/// Override to force simple IDs all around
/// </summary>

public override string ClientID
{
    get
    {
        return this.ID;
    }
}

答案 14 :(得分:1)

存在明显变化的风险:

<asp:Label ID="Label1" runat="server" Text="test"></asp:Label>

<Label ID="Label1" Text="test"></Label> 

答案 15 :(得分:1)

您需要将属性ClientIDMode="Static"放在按钮中,这样可以在运行时授予ID相同的功能,这就是您在Javascript中获取对象所需的内容。

答案 16 :(得分:0)

你不需要“阻止”asp.net更改控件ID,以便使用jquery或javascript来完成此事。

在页面上呈现的ID是控件的ClientID属性,您在控件上设置的是ID。您无法设置ClientID属性,它是为您生成的,可能与您的ID相同或不同。但是,正如其他人所提到的,您可以在aspx中使用ClientID属性:

$('<%= Label1.ClientID %>').html()

或使用ClientScriptManager方法之一在代码隐藏文件中注册客户端脚本。

答案 17 :(得分:0)

摆脱占位符。或者按类或DOM层次结构选择。或者甚至在ID上使用部分匹配作为最后的手段。在jQuery中有许多简单,干净的方法来选择元素,我们需要摆脱旧的,丑陋的ASP.NET习惯。

Dreas Grech把最后的钉子放在棺材里。您不能将外部脚本文件与$('#&lt;%= label1.ClientID%&gt;')类型解决方案一起使用。

迈克

答案 18 :(得分:0)

您仍然可以使用PlaceHolders并在PlaceHolder标记中设置 ClientIDMode

<asp:ContentPlaceHolder ID="BodyContent" runat="server" ClientIDMode="Static">        
</asp:ContentPlaceHolder>

所有包含的控件ID都不会被更改。

答案 19 :(得分:0)

简单,覆盖控件类。下面是一个HtmlGenericControl示例,但您可以使用任何ASP.Net控件执行此操作:

public class NoNamingContainerControl : HtmlGenericControl
{
    public NoNamingContainerControl(string tag) : base(tag) { }
    public override string ClientID
    {
        get
        {
            return this.ID;
        }
    }
}