2010-01-16 65 views
4

我需要從Silverlight控件中將東西推入我的ASP.NET Web窗體頁面。我可以依靠ctl00_PagePlaceHolder_myId保持不變嗎?

我設置了我的文本框的ID,就像它想要的那樣,ASP.NET「有用地」添加了ctl ... blah_blah的東西。我能否認爲這將始終與我的身份證開始時相同的gumpf?

善良,

編輯:感謝您的答覆傢伙。

使用從我的Silverlight控件的HtmlPage.Document,我用Doug的解決方案,這樣的...

var spec = HtmlPage 
      .Document 
      .GetElementsByTagName("input") 
      .FirstOrDefault(so => ((HtmlElement)so).CssClass == "spec"); 

回答

4

不,它可以很容易地改變,如果你曾經添加另一個控制在它的前面,或者是窩在另一個控制。此外,根據瀏覽器的不同,ID也不同。在某些瀏覽器中,.NET_分開,其他瀏覽器使用$。我沒有使用Silverlight,但你能找到一個具有某個類的元素嗎?您可以將類名稱應用於元素,ASP.NET根本不會編輯它。

+0

謝謝,道格。好主意RE:cssclass ...我會給你一個鏡頭。 – 2010-01-16 18:19:04

+0

編輯問題與我的使用你的解決方案...再次感謝你和喬爾! – 2010-01-16 18:41:35

4

否。在某些情況下,它可以以不同的方式呈現,並且頁面中其他位置的更改可能會更改此控件。處理此問題的正確方法是引用控件的.ClientID屬性。


更新

這是怎麼了,我通常處理客戶端ID:

<head runat="server"> 
    ... 
    <script language="javascript"> 
    var ControlIDs = { 
     SomeControl = <%="'" + SomeControl.ClientID%>', 
     OtherControl = <%="'" + OtherControl.ClientID%>' 
    }; 
    </script> 

    ... other script references here ... 
</head> 

我把劇本第一在頭元件,使其對其他腳本文件訪問;這樣我就不需要通過asp.net處理器傳遞javascript文件,我只需要寫出每個客戶端id一次。沒有必要擔心逃脫任何事情,因爲'和\字符永遠不會成爲呈現的客戶端ID的一部分。 controlIDs對象的原因是爲了避免命名與其他腳本的衝突,並且在服務器代碼中連接前端的「'」的原因是asp.net不會在其他情況下看到<%

再次說明:這是我平時所做的事情,但對於一些簡單的頁面來說,這可能是矯枉過正的。

+0

謝謝,喬爾!請你舉個例子來說明一下這種情況嗎? – 2010-01-16 18:22:51

+0

查看@ Doug的回答。他很好地覆蓋它。重點是你需要使用ClientID屬性。 – 2010-01-16 18:30:55

+0

傳遞出來的最好方法是什麼? ''這樣的事情? – 2010-01-16 18:32:25

0

這可能不會幫助你,但值得注意的是,.NET 4.0提供了一個新的ClientIDMode property,這將緩解這種行爲的問題。特別是,使用PredictableStatic設置將產生容易確定的ID。看看前面的鏈接,並向下滾動以查看可預測模式的樣子。我還建議閱讀ASP.NET Web Server Control Identification

相關問題