2012-09-06 50 views
0

我對ASPX腳本:JavaScript變量沒有發現

<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未定義?

+0

我的事情你剛纔宣佈'公開名單 Tourne;'但你需要使用之前給一個定義。(我不是一個.net開發者) –

+0

只是一個更好的編碼風格的想法:不要插入一個完整的JavaScript函數到事件處理程序。減少到方法調用。 – reporter

回答

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」的標記底部,並在這裏發佈 - 它應該幫助弄清楚發生了什麼。

+0

謝謝你,但不是因爲'或'' – user609511

+0

在這種情況下,請你可以按照我答覆的最後一段中的建議,以便我們可以進一步調查? – tristankoffee

0

我遇到了同樣的問題,我發現我的頁面在創建問題的更新面板中。我不得不禁用腳本管理的部分呈現屬性象下面這樣:

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