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'" の 4 番目の要素を追加した場合 (余分な単一引用符があるため無効です):

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

次に、次の無効な JavaScript をレンダリングします。

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

これが発生すると、JavaScript が無効なため、「Tourne」が正しく定義されません。そのため、データを配列に入れる前に「クレンジング」する必要があります。以下は、単一引用符を「エスケープ」するために機能するはずです。

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 に答える