我需要从Silverlight控件中将某些东西放到我的ASP.NET Web表单页面中。
我设置了我的文本框的ID,并且按照它的需要,ASP.NET“帮助”添加了ctl ... blah_blah的东西。我可以假设这将永远与我在我身份的开头放置的gumpf相同吗?
善,
丹
编辑:感谢回复人员。使用Silverlight控件中的HtmlPage.Document,我使用Doug的解决方案......
var spec = HtmlPage
.Document
.GetElementsByTagName("input")
.FirstOrDefault(so => ((HtmlElement)so).CssClass == "spec");
答案 0 :(得分:4)
不,如果你在它前面添加另一个控件,或者将它嵌套在另一个控件中,它可能很容易改变。此外,ID因浏览器而异。在某些浏览器.NET
与_
其他浏览器的分割使用$
。我没有使用Silverlight,但是你能找到一个具有某个类的元素吗?您可以将类名应用于元素,ASP.NET根本不会编辑它。
答案 1 :(得分:4)
没有。在某些情况下,它可以以不同方式呈现,而页面中其他位置的更改可能会更改此控件。处理此问题的正确方法是引用控件的.ClientID
属性。
<强>更新强>
这就是我通常处理客户端ID的方式:
<head runat="server">
...
<script language="javascript">
var ControlIDs = {
SomeControl = <%="'" + SomeControl.ClientID%>',
OtherControl = <%="'" + OtherControl.ClientID%>'
};
</script>
... other script references here ...
</head>
我将脚本首先放在head元素中,以便其他脚本文件可以访问它;这样我就不需要通过asp.net处理器传递javascript文件了,我只需要写出每个客户端ID一次。没有必要担心转义任何东西,因为'和\字符永远不会成为渲染客户端ID的一部分。 controlIDs对象的原因是避免命名与其他脚本的冲突,并且在服务器代码中连接前面的“'”的原因是asp.net不会看到<%
。
再说一遍:这就是我通常做的事情,但是对于一些简单的页面来说,它可能有点过分。
答案 2 :(得分:0)
这对你现在可能没有帮助,但值得注意的是.NET 4.0具有新的ClientIDMode property,这将缓解围绕此行为的麻烦。特别是,使用Predictable
和Static
设置将产生易于确定的ID。查看上一个链接并向下滚动以查看可预测模式的示例。我还建议阅读ASP.NET Web Server Control Identification。