.NET项目中的HTML标签ClientID
如果我想在基于母版页的aspx页内的服务器上操纵HTML标记的属性,即
<a href="#" runat="server" ID="myLink">My Link</a>
例如,根据当前页面为链接赋予不同的类,即
if (Path.GetFileName(Request.PhysicalPath) == "MyPage") { myLink.Attributes.Add("class","active"); }
.NET将链接的ID属性更改为类似
<a href="#" ID="ct100-foo-myLink">My Link</a>
有什么办法可以阻止这种情况的发生并保留原始ID?
提前致谢
解决方案
我不这么认为。
但是,我们可能希望保留原始名称,以便可以使用javascript操作控件。它将在运行时返回分配的ID。
编辑:
看起来有一种方法可以完成,但是需要做一些工作...看一下ASP.NET控件改进自动ID生成:体系结构更改(第3部分)
我没有阅读完整的帖子,但看起来他创建了自己的容器和自己的命名提供程序。我认为,如果我们想保持控件名称不变,只需将名称返回
public abstract string SetControlID(string name, System.Web.UI.Control control);
我从来没有想过如何防止.NET这样做,但是我开始做的是放置asp:Literals并使用c向它们添加WebControl。如果编写WebControl,则可以设置各种属性,而无需获取.NET的唯一ID。
例如:
<asp:Literal ID="myLink" />
...
WebControl a = new WebControl(HtmlTextWriterTag.A); a.CssClass = "active"; a.Attributes["href"] = "#"; Literal text = new Literal(); text.Text = "click here"; a.Controls.Add(text); myLink.Controls.Add(a);
这将导致以下html:
<a href="#" class="active">click here</a>
总体而言,这是一个非常肮脏的解决方案,但是我当时不知道该怎么办,所以我有一个截止日期。 ;)
AFAIK没有办法。
它显示了实际的控制树,在本例中为masterpage-content-control。
但是,如果将ID添加到母版页上(this.ID =" whatever"),则将看到" whatever"而不是ctl00(表示控制索引0)。
是的,出于JavaScript和CSS的原因,我们将需要保留原始ID。我注意到ClientId属性,但它是只读的,无法分配,因此我不确定如何使用它?
这篇博客文章可能会有所帮助:
从ASP.Net主页上删除名称处理(找回ID!)
帖子中的解决方案覆盖了.getElementById方法,使我们可以仅使用常规ID来搜索元素。也许我们可以使其适应需求。
免责声明:ASP.NET的行为是设计使然,这是很好的方式,即使对于HTML Server控件(例如示例中的控件)也是如此。 Server-ID和Client-ID是两个截然不同的东西,不应混为一谈。如果没有这种机制,使用母版页或者用户控件可以以相同的客户端ID结尾。
无法直接进行。我们可以创建一个新控件,该控件继承该链接并覆盖其ClientID以直接返回该ID。但这似乎是过分的。我们可以简单地使用HTML标记,并在需要时使用<%GetClass()%>添加类。
关于ClientID for Javascript的用法:
<a ID="myLink" runat="server">.... var ctrl = document.getElementById('<%# myLink.ClientID %>');
当然,我们需要在代码中的某个位置放置一个DataBind。
为什么不只使用标准标记,并使用渲染块对其进行修改,然后将其行为锁定在客户端上。
我只是发现了一种使用jQuery的简单方法。
var mangled_name = $("[id$=original_name]").attr("id");
因此,如果我们具有这样的服务器控件:
<asp:TextBox ID="txtStartDate" runat="server" />
我们可以使用以下方法在jQuery / Javascript中获得错误的名称:
var start_date_id = $("[id$=txtStartDate]").attr("id");
由于它是一个字符串,因此我们也可以"内联"使用它,而不是分配它,例如将其与选择器的其他元素串联在一起。