调用C#则相同的元素JS

问题描述:

我使用以下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

既然你想通过服务器端和客户端进行更新,你应该改变你的方法。

离开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

我不知道为什么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

您可以使用

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

这将改变的ID StatusPreview根据客户端的ID。

+0

这给了我第一次尝试调用'js'时不能设置属性'innerHTML'的null'异常。 – starvator 2014-10-27 12:48:05