如何使用带有ASP.net runat ='server'标签的传统HTML id属性?
我正在重构网站上的一些CSS。我一直在努力,发现代码中没有传统的HTML ID。
大量使用CssClass ='
,或者有时只是使用class ="''
,但是我似乎找不到找到id =''的方法,也没有让它被服务器替换掉。
这是一个例子:
<span id='position_title' runat='server'>Manager</span>
当响应从服务器返回时,我得到:
<span id='$aspnet$crap$here$position_title'>Manager</span>
这里有什么帮助吗?
解决方案
回答
.Net总是用一些残缺不全的值替换id值(每个值都可以稍作预测,但仍然不要指望)。我们是否真的需要让该ID为runat = server?如果我们不输入runat = server,那么它就不会混乱...
添加:
就像leddt所说的那样,我们可以使用ClientID来引用跨度(或者任何带id的runat = server),但是我认为这不适用于CSS。
但是我认为,如果CSS使用基于ID的选择器,则会遇到更大的问题。我们不能重复使用ID。同一页上不能有多个具有相同ID的项目。 .Net会对此抱怨。
因此,考虑到这一点,我们重构CSS的工作范围会变得更大吗?
回答
ID前面的"废话"与控件的容器有关,据我所知,没有办法阻止这种行为,除非不将其放入任何容器中。
如果需要在脚本中引用id,则可以使用控件的ClientID,如下所示:
<script type="text/javascript"> var theSpan = document.getElementById('<%= position_title.ClientID %>'); </script>
回答
好吧,我想这是一个陪审团。
@leddt,我已经知道"废话"是围绕它的容器,但我认为也许微软会留下后门,不让ID留下。通过包含ClientID在每次使用时重新生成CSS文件是一个可怕的想法。
我或者无处不在使用类,或者在CSS中硬编码了一些看起来乱七八糟的ID。
回答
@Matt Dawdy:CSS中ID的用途非常广泛,主要是当我们要设置元素的样式时,该元素只在网站或者页面中出现一次,例如注销按钮或者标头。
回答
如果我们正在访问span
或者任何标记,从后面的Cor VB代码中给我们带来问题,则必须保留runat =" server"
,而应使用<span class =" some_class" id =" someID">。如果我们不在后面的代码中访问标记,则删除
runat =" server"`。
回答
最好的办法是给它一个唯一的类名。
回答
我们可能必须从跨度中删除runat =" server",然后在跨度中放置一个,以便可以对跨度进行样式化并仍然具有动态内部内容。
这不是一个优雅或者简单的解决方案(并且需要重新编译),但是它可以工作。
回答
使用jQuery选择元素:
$("span[id$='position_title']")....
jQuery的灵活选择器,特别是它的"以...开头" /"以选择器结尾"(上面显示了"以...结尾"选择器)为ASP.NET的dom id munge提供了一种很好的方法。
rp
回答
我不知道一种阻止.NET破坏ID的方法,但是我可以想到几种解决它的方法:
1个嵌套跨度,一个带有runat =" server",一个没有:
<style type="text/css"> #position_title { // Whatever } <span id="position_titleserver" runat="server"><span id="position_title">Manager</span></span>
2如Joel Coehoorn建议的那样,改用唯一的类名。已经在使用该类了吗?没关系,我们可以使用多个!这...
<style type="text/css"> .position_title { font-weight: bold; } .foo { color: red; } .bar { font-style: italic; } </style> <span id="thiswillbemangled" class="foo bar position_title" runat="server">Manager</span>
...将显示以下内容:
经理
3编写Javascript函数以在页面加载后修复ID
function fixIds() { var tagList = document.getElementsByTagName("*"); for(var i=0;i<tagList.length;i++) { if(tagList[i].id) { if(tagList[i].id.indexOf('$') > -1) { var tempArray = tagList[i].id.split("$"); tagList[i].id = tempArray[tempArray.length - 1]; } } } }
回答
如果我们担心类问题,请尝试在包含我们要设置样式的元素的父或者子选择器上使用id。此父元素不应应用runat服务器。简而言之,计划结构容器不要在后面运行代码(即,不要运行代码)是个好主意,这样我们就可以使用未更改的ID访问应用程序/站点的主要部分。如果这样做为时已晚,请添加包装div / span或者使用上述的类解决方案。
回答
我们是否有特定的原因希望我们将控件运行为runat =" server"?
如果是这样,我第二次使用<asp:Literal>。 。 。
它应该为我们完成工作,因为我们仍然可以在后面的代码中编辑数据。
回答
我通常会做自己的扩展WebControl或者HtmlGenericControl的控件,并覆盖返回ID属性而不是生成的ClientID的ClientID。这将导致.NET对ClientID进行的任何转换,因为将命名容器还原为我们在标记标记中指定的原始ID。如果我们使用的是jQuery之类的客户端库,并且需要可预测的唯一ID,那么这很好,但是如果我们依赖ViewState进行服务器端的操作,这将非常困难。
回答
我们可以将CSS嵌入页面中,并添加一些服务器标签来解决该问题。在运行时,代码块将替换为ASP.NET生成的ID。
例如:
[style type =" text / css"]
#<%= AspNetId.ClientID%> {
...样式在这里...
}
[/风格]
[script type =" text / javascript"]
document.getElementById(" <%= AspNetId.ClientID%>");
[/脚本]
如果我们想将CSS包含在一个单独的文件中,则可以更进一步,并具有一些也会生成CSS的代码文件。
另外,我可能在这里有点不高兴,但是我们可以使用ASP.NET MVC东西(在撰写本文时尚未正式发布),它远离Web窗体,使我们可以完全控制所生成的标记。
回答
我敢肯定,在这里至少有人问过这个问题。这个词是"苦恼"。 Rich Strahl在2006年也写了一篇关于它的文章。
回答
大多数修复建议她对一个非常简单的问题过于矫kill过正。只需使用CSS定位单独的div和span。如果要使用ID,请不要直接定位ASP.NET控件。
<span id="FooContainer"> <span runat="server" id="Foo" > ...... <span> </span>