如何使用带有ASP.net runat ='server'标签的传统HTML id属性?

时间:2020-03-05 18:54:05  来源:igfitidea点击:

我正在重构网站上的一些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",而应使用&lt;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>