有没有一种简单的方法可以从.NET用户控件中删除“ct100”前缀?

4
长话短说,有几十页没有使用主页面。为了创建一个新模块,我创建了一个带有菜单控件的主页面(菜单控件已经存在),这样我现在正在创建的六个左右页面就可以拥有相同的外观了。由于内容页面使用主页面,因此菜单控件的名称被更改为ct100_Menu1而不是Menu1。这并不成问题,除非有人决定使用控件的确切名称来命名CSS样式表,通过其确切ID(例如,CSS代码是 Menu1 a { /* stuff */ })。因此,菜单无法正确呈现,因为我正在使用主页面而不仅仅是复制代码
我无法更改菜单文件中的CSS代码,因为这可能会导致某些问题,那么有没有办法可以更改控件以不显示这个麻烦的ct100,而不必添加任何工具或操作创建自己的自定义控件(因为我不能替换Menu.ascx控件,尽管我可以修改它以添加CSS类),或者我的唯一选择是要么不使用主页面,要么将菜单CSS复制到另一个文件中并适当地设置它?
感觉有些陷入困境,因为代码是故意编写的,以便你不能使用主页面,也没有人回来更改它。

1
在使用.NET时,使用类名而不是ID的另一个原因。 - Diodeus - James MacFarlane
可能可以添加自定义响应过滤器,并使用正则表达式或其他方法解析出额外的位。http://msdn.microsoft.com/en-us/library/system.web.httpresponse.filter.aspx(我知道这是一种非常粗糙的做法,在长期维护中可能会对可维护性造成伤害) - asawyer
6个回答

7

您应该将ClientIdMode设置为Static。 这里有来自MSDN的更多信息。注意:这仅适用于.NET 4.0。

在早期版本中,我建议使用类进行样式设置,因为您无法真正控制在使用它的所有地方名称将是什么(正如您所发现的那样)。


3

如果您使用的是ASP.net 4.0,您可以设置控件的ClientID属性。

否则,您需要使用自定义控件、ASP.net Literals或JavaScript来更改ID,这可能会带来很多麻烦。


1
3.5 :( 看起来我的唯一选择就是复制CSS,至少不会在其他事情上花费“太多时间”(因为那样我会因为想使用主页而受到责罚,而不是只是复制/粘贴,这被视为更快的方法...) - Wayne Molina

1

你正在使用.NET 4吗?如果是,你可以在你的控件上设置它:

 <asp:SomeControl ClientIDMode="Static" />

1

只需将新名称添加到CSS中 - 不要删除旧名称(因为您说这是一个问题):

 ctl100_Menu1 a, 
 Menu1 a { /* stuff */ }

如果在不同的页面上Menu1有不同的名称会发生什么?你只需继续添加到该选择器中。我不认为这是最优的做法。 - scottheckel
1
它目前总是有名称Menu1 - 以一致的方式添加主页面应该导致它始终具有名称ctl100_Menu1。如果这种情况不断增加,我必须同意这并不是最佳选择。 - Steve Barron

0
如果您正在使用ASP.NET 4.0,您可以覆盖ClientId渲染模式,无论是每个控件还是所有控件。例如:
<my:Menu runat="server" Id="Menu1" ClientIDMode="Static" />

这将强制保留值“Menu1”作为呈现元素的客户端ID。(请参见此处)。

不过,我建议对菜单元素应用CSS类,并调整围绕类的CSS规则。例如:

#Menu1 a {

...转换为:

#Menu1 a,
div.menu a {

...等等


0
要为整个 Web 应用程序“纠正”此行为,请在 web.config 中查找以下标记:
<system.web>
    ...
    <pages ... clientIDMode="*something*">
    </pages>
    ...
</system.web>

移除clientIDMode="*something*"属性的定义。直接删掉即可。

太好了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接