如何通过带有连字符的 ID 获取 html 控件?
Posted
技术标签:
【中文标题】如何通过带有连字符的 ID 获取 html 控件?【英文标题】:How to get html control by ID that has hyphens? 【发布时间】:2014-11-13 04:41:50 【问题描述】:我有一个用 html 编写的前端,我正在将其转换为 asp,并且许多控件的名称中都带有“-”。这引起了疯狂的头痛,因为没有时间重命名所有内容,并且 ctrl-f 和 replace 以某种方式破坏了我的 css。当它们有破折号时,有什么方法可以在后面的代码中访问这些控件?下面的代码我试过了。
//Can find when there is no dash in it, but that breaks the css after find/replace of full solution
HtmlGenericControl body = (HtmlGenericControl)this.Page.FindControl("page-list");
body.Attributes.Add("class", GlobalVariables.webAppSkin);
//I have also tried this, but logout stays null
WebControl logout = (WebControl)Page.FindControl("logout-link");
这是 html 控件:
<body id="page-list">
【问题讨论】:
你试过this.Page.FindControl(@"page-list");
我不确定这是否有效,但我稍后会尝试。
是的,还是抓不到那个讨厌的控件。
@Greg "page-list" 没有任何需要转义的字符,因此使用字符串文字不会有任何区别。
我相信这是不可能的。此外,您无法在后面的代码中找到未标记 runat="server" 的控件。您需要在 HTML 标记和 CSS 中重命名并添加上述属性。查找和替换。
@TylerH JQuery UI?这是我很久没有听到的名字了。我感觉到你的痛苦。祝你好运。
【参考方案1】:
对不起,这不会发生。
您不能拥有一个 id 包含“-”的元素,并且仍然是 runat="server"
ASP.NET 控件。
Microsoft 关于控件 ID 的文档指出:
http://msdn.microsoft.com/en-us/library/system.web.ui.control.id.aspx
只有字母数字字符和下划线字符 (_) 的组合是此属性的有效值。包含空格或其他无效字符将导致 ASP.NET 页面解析器错误。
如果您尝试将runat="server"
添加到您显示的正文标签:<body id="page-list">
,它将在aspx.designer.cs
中为您提供以下行:
protected global::System.Web.UI.HtmlControls.HtmlGenericControl page-list;
这显然会引发 C# 语法异常。
【讨论】:
所以 ASP 在有效 html 下设计崩溃。难怪我不喜欢这个平台,一个设计的错误,多么美妙。【参考方案2】:<body id="page-list">
不是 HTML 控件(即 System.Web.UI.Control
的(子类)实例,因为它没有 runat="server"
属性。如果要添加 runat="server"
,那么您将获得 JIT编译时错误消息,通知您“page-list”不是有效的标识符。
ASP.NET Web Forms 4.0 添加了ClientIDMode
属性,但是它不允许您设置完全自定义的ID 属性值。如果不使用 <asp:Literal>
或实现您自己的控件(或我的首选选项:切换到 ASP.NET MVC),则没有简单的解决方案。
【讨论】:
【参考方案3】:如果您编写 runat="server",您可以使用其 ID 访问代码中的控件。这是您的案例的示例
<body runat="server" id="testID">
在后面的代码中你可以这样访问它:
body.Attributes.Add("class", value);
【讨论】:
runat="server" 给我带来了问题,因为它在 Default.aspx.designer.cs 中声明了变量的实例,它不能用破折号编译... 在这种情况下更改不带破折号的 ID,并在 css 中写入 .body css script 问题的重点是如何在保留破折号的同时做到这一点。以上是关于如何通过带有连字符的 ID 获取 html 控件?的主要内容,如果未能解决你的问题,请参考以下文章