2014-10-27 91 views
0

我使用以下c#改變從服務器端內容:調用C#則相同的元素JS

this.StatusPreview.InnerHtml = "server side"; 
this.StatusPreview.Update(); 

我使用以下js改變對客戶端的內容:

document.getElementById('StatusPreview').innerHTML = "client side"; 

如果我先執行js,則沒有問題。但是,如果我先執行c#,則js,我收到了,

Uncaught TypeError: Cannot set property 'innerHTML' of null 

js線。

這是受到影響的元素:

<td id="StatusPreview" runat="server"> </td> 

當我執行c#,它改變了td

<span id="el_StatusPreview_container">asd</span> 

有沒有辦法,讓我更新c#第一,不轉動我的元素null

謝謝!

+0

在服務器端代碼中,添加:this.StatusPreview.ClientIDMode = System.Web.UI.ClientIDMode.Static;這將告訴asp.net保持原樣,而不是重命名它。我通常使用這個在頁面上的控件,我沒有用它在服務器端,但它應該工作。 – 2014-10-27 12:36:46

+0

@CMKanode'this.StatusPreview.ClientIDMode = System.Web.UI.ClientIDMode.Static'並未阻止元素被重命名 – starvator 2014-10-27 12:52:06

+0

我錯過了創建新元素的部分。 – 2014-10-27 13:03:39

回答

1

既然你想通過服務器端和客戶端進行更新,你應該改變你的方法。

離開td標籤作爲一個普通的標籤,並添加一個標籤作爲一個孩子:

<asp:Label ID="StatusPreview" runat="server" ClientIDMode="static" /> 

如果JavaScript的第一次更新,它會找到的元素。如果服務器端更新它,那麼將ClientIDMode設置爲靜態,它不會更改ID,並且由於它已經是Web控件,因此它不會創建新元素,因此JavaScript仍然可以找到它。

+0

絕妙的主意!我在'c#'中使用'this.StatusPreview.Text'而不是'InnerHtml',它就像一個魅力!謝謝! – starvator 2014-10-27 13:11:56

+0

很高興有幫助。 – 2014-10-27 13:54:22

0

我不知道爲什麼td正在變成一個span但JavaScript不能找到它,因爲ASP.NET命名約定,默認情況下它會其父INamingContainerID增加的對ClientID的元件。您可以通過設置控制的ClientIDMode克服這個問題,Static,所以它會被設置爲相同的ID

<td id="StatusPreview" runat="server" ClientIDMode="static"> </td> 
+0

我將'ClientIdMode'設置爲'static',但這並沒有改變任何東西,我仍然得到相同的錯誤。該ID仍然被重命名。 – starvator 2014-10-27 12:51:14

0

您可以使用

document.getElementById('<%= StatusPreview.ClientID %>').innerHTML = "client side"; 

這將改變的ID StatusPreview根據客戶端的ID。

+0

這給了我第一次嘗試調用'js'時不能設置屬性'innerHTML'的null'異常。 – starvator 2014-10-27 12:48:05