我可以依靠ctl00_PagePlaceHolder_myId保持不变吗?

时间:2010-01-16 18:11:56

标签: asp.net silverlight

我需要从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");

3 个答案:

答案 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,这将缓解围绕此行为的麻烦。特别是,使用PredictableStatic设置将产生易于确定的ID。查看上一个链接并向下滚动以查看可预测模式的示例。我还建议阅读ASP.NET Web Server Control Identification