找不到Javascript变量

时间:2012-09-06 09:30:28

标签: javascript asp.net

我在ASPX上有脚本:

<dx:ASPxButton ID="ASPxButton_PrintLetrVoit" runat="server" Text="Impression lettre de voiture(décalage)" AutoPostBack="False">
      <ClientSideEvents Click="function (s, e) { e.processOnServer = false; for (var i = 0; i < Tourne.length; i++) {window.open('PrintLettreVoit.aspx?TourneId='+Tourne[i]);}}" />
</dx:ASPxButton>

和cs:

public List<string> Tourne;

protected void Page_Load(object sender, EventArgs e)
{
      try
      {
          foreach (var oItem in oOrdre_BL.GetAllLettrVoit_Tourne())
          {
           Page.ClientScript.RegisterArrayDeclaration("Tourne", "'"+oItem+"'");
          }
      ......

不幸的是我在javascript上遇到了错误: 我收到了错误:

Horodatage : 06/09/2012 11:23:03
Erreur : ReferenceError: Tourne is not defined
Fichier Source : http://xxxxxxx/Code/BackEnd/FaExped_BackEnd_WebSite/Ordre.aspx
Ligne : 5146

任何想法?

提前谢谢你

PS:当我看到生成的源代码时:

<script type="text/javascript">
//<![CDATA[
var Tourne =  new Array('');
//]]>
</script>


<script type="text/javascript">
//<![CDATA[

WebForm_InitCallback();//]]>
</script>
</form>


</body>
</html>

我修改了我的代码:

 <dx:ASPxButton ID="ASPxButton_PrintLetrVoit" runat="server" Text="Impression lettre de voiture(décalage)" AutoPostBack="False">
                          <ClientSideEvents Click="function (s, e) {   
                          if(typeof(Tourne) !== 'undefined' && Tourne != null) 
                          {
                            e.processOnServer = false; 

                             for (var i = 0; i < Tourne.length; i++) {window.open('PrintLettreVoit.aspx?TourneId='+Tourne[i]);}
                          }
                          else
                          {alert ('Tous est coches');}

                             }" />
                        </dx:ASPxButton>

但是,它仍然不是一个好的解决方案,因为我不知道为什么Tourne未定义?

2 个答案:

答案 0 :(得分:0)

可能是数据中有一些单引号。这是一个问题的原因如下:

当您调用“Page.ClientScript.RegisterArrayDeclaration”时,它会将该项添加到页面底部的JavaScript数组声明中。

所以,以下内容:

Page.ClientScript.RegisterArrayDeclaration("Tourne", "'a'");
Page.ClientScript.RegisterArrayDeclaration("Tourne", "'b'");
Page.ClientScript.RegisterArrayDeclaration("Tourne", "'c'");

将在页面上呈现以下JavaScript:

<script type="text/javascript">
//<![CDATA[
var Tourne =  new Array('a', 'b', 'c');
//]]>
</script>

如果“oOrdre_BL.GetAllLettrVoit_Tourne()”返回的数据中有任何单引号,则会插入这些单引号。所以,如果我添加了“'brok'en'”的第四个元素(因为它有一个额外的单引号而无效):

Page.ClientScript.RegisterArrayDeclaration("Tourne", "'brok'en'");

然后它会呈现以下无效的JavaScript:

<script type="text/javascript">
//<![CDATA[
var Tourne =  new Array('a', 'b', 'c', 'brok'en');
//]]>
</script>

如果发生这种情况,那么“Tourne”将永远无法正确定义,因为JavaScript无效。因此,在尝试将数据放入数组之前,应该“清理”数据。以下应该可以“逃避”单引号:

Page.ClientScript.RegisterArrayDeclaration("Tourne", "'" + oItem.Replace("'", "\\'") + "'");

当然,这是基于错误数据的假设。如果这不起作用,最好的办法是在查看页面时在浏览器中“查看源代码”。看一下标记的底部,其中“Tourne”在JavaScript中定义,并在此处发布 - 它应该有助于弄清楚发生了什么。

答案 1 :(得分:0)

我遇到了同样的问题,我发现我的页面位于创建问题的更新面板中。我必须禁用脚本管理器的部分呈现属性,如下所示:

<telerik:RadScriptManager ID="radScriptManager1" runat="server" EnablePartialRendering="false"/>