0

我在 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 是未定义的?

4

2 回答 2

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("'", "\\'") + "'");

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

于 2012-09-06T12:11:43.053 回答
0

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

<telerik:RadScriptManager ID="radScriptManager1" runat="server" EnablePartialRendering="false"/>
于 2016-04-04T06:18:15.173 回答