.NET项目中的HTML标签ClientID

时间:2020-03-06 14:32:09  来源:igfitidea点击:

如果我想在基于母版页的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");

由于它是一个字符串,因此我们也可以"内联"使用它,而不是分配它,例如将其与选择器的其他元素串联在一起。