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

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

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

而当页面呈现控件的id改变为这样的东西

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

我怎样才能停止改变ID为了执行这样的jQuery操作的asp.net

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

而不是使用这个select器

 $('#Label1') 

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

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

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

如果你想使用外部文件,那么我会build议你在页面上创build一个全局的obj来保存所有的客户id,然后在你的外部文件中引用这个obj(不理想,但它是一个解决scheme)

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

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

.NET 4现在可以让你select你的ClientIDMode :

types: System.Web.UI.ClientIDMode

指示如何生成ClientID属性的值。 默认是inheritance。

AutoID ClientID值是通过将每个父命名容器的ID值与控件的ID值连接而生成的。 在呈现多个控件实例的数据绑定scheme中,将在控件的ID值前插入递增值。 每个段由下划线字符(_)分隔。 此algorithm用于早于ASP.NET 4的ASP.NET版本。

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

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

inheritance控件inheritance其NamingContainer控件的ClientIDMode设置。

你不能停止生成这些ID的asp.net。 这就是它如何做的事情。

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

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

要么

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

仅当你的容器布局永远不会改变你需要把你的JavaSctipt / jQuery放到一个外部文件中,你可以在你的jQueryselect器中使用生成的id

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

显然,这种方法要求你找出生成的id是什么,如果你开始改变站点/应用程序的构造,需要小心。

否则,你最好的select是

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.使用jQueryselect器模式匹配原始的id,这将允许你把你的js代码放在一个外部文件中 –

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

这个jQueryselect器将select所有具有以Label3结尾的属性id的元素。 这种方法唯一可能的缺点就是理论上可能会有一个标签控件,其中包含一个名为Label3的标签,也就是一个母版页,也可以在两个内容页中。 在这个例子中,使用上面的jQueryselect器将匹配所有三个标签,这可能会有不必要的后果。

编辑:

我认为把注意力集中到IDOverride控件上可能会有用。 示例页面可以在这里find

它使您可以指定哪些控件在输出的HTML标记中应该有自己的损坏的id,如在.aspx文件中给出的id所覆盖的那样。 我只用一个主页和面板简单地玩了一下,但它似乎运作良好。 使用这个,你可以在你的jQueryselect器中使用原始的id。 但是,请注意,如果您的母版页和内容页中的控件具有相同的ID,并且这些控件的内容页被合并为一页的HTML,则结果是不可预知的。

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

例:

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

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

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

然后在jQuery中,您可以通过以下方式引用此元素:

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

我一直用jQuery来做这件事。 希望能帮助到你。

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

如果你在母版的第一行中input这个,你的控件ID不会改变:

ClientIDMode="Static"

喜欢;

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

这里的大部分build议都可以工作,但是jQuery代码的testing结果显示,纯IDselect器是最快的。 我最经常使用的一个:

 $("[id$=origControlId]") 

是相当缓慢的,但问题不是太明显,除非页面有很多控件和很多的jQuery。

既然将多个类分配给一个控件是相当痛苦的,你可以给每一个CSSClass匹配这个ID。 由于他们将是唯一的(你将不得不观看生成多个控件的中继器types控件),你可以按类select。

例如:

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

可以唯一地select:

 $(".Label1") 

几乎和IDselect一样快。

我从来没有考虑过这个:

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

但我要去试试看!

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

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

您可以使用ClientID (就像其他人所说的一样),但问题是它不能在外部JavaScript文件中使用。

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

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

那么你可以像这样引用它:

 $(".myclass") 

你可以像这个家伙一样覆盖ClientID和UniqueID。

 /// <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; } } 

您也可以创build一个inheritance自Label的自定义控件,该控件将ID属性重写为您所希望的。

这可以通过在呈现控件时用原始idreplaceasp.net id来实现。 这很容易,可以通过创build一组自定义控件来避免。

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

面临明显变化的风险:

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

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

你需要把属性ClientIDMode="Static"放到你的button中,这个授予的ID在运行时是一样的,这就是你需要在Javascript中获得对象的东西。

你不需要“防止”asp.net改变控制ID为了使用jquery或者javascript就可以了。

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

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

或者使用其中一种ClientScriptManager方法在客户端脚本的代码后面注册客户端脚本。

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

Dreas Grech把最后的钉子放在棺材里。 您不能在$('#<%= label1.ClientID%>')types的解决scheme中使用外部脚本文件。

麦克风

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

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

所包含的控制ID都不会被改变。

简单,重写控件类。 这里是一个HtmlGenericControl的例子,但你可以用任何ASP.Net控件来做到这一点:

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