2012-06-29 70 views
2

我有一個按鈕和的onclick被設置爲這個方法,其應顯示一個簡單的JS警報彈出窗口:asp.net JavaScript消息沒有顯示出來

string message = "File is already open. <br>Please close the file and try again."; 
    System.Text.StringBuilder sb = new System.Text.StringBuilder(); 
    sb.Append("<script type = 'text/javascript'>"); 
    sb.Append("window.onload=function(){"); 
    sb.Append("alert('"); 
    sb.Append(message); 
    sb.Append("')};"); 
    sb.Append("</script>"); 
    ClientScript.RegisterClientScriptBlock(this.GetType(), "alert", sb.ToString()); 

我已經使用上面之前的代碼,它有工作但不是這次。 唯一的區別是我爲其他網站使用母版頁,而不是這個,而且這個網頁也有一個計時器。

在aspx頁面的<head>中是否有與加載有關的任何JS?

protected void btnToCSV_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      StreamWriter writer = new StreamWriter(@"\\server location\test.csv"); 

      Some writer.write stuff... 

      writer.Close(); 
     } 
     catch (Exception ex) 
     { 
      lblMessage.Visible = true; 
      string message = "File is already open. Please close the file and try again."; 
      ClientScript.RegisterClientScriptBlock(
       this.GetType(), 
       "alert", 
       string.Format("alert('{0}');", message), 
       true); 

     } 
} 
+0

試試你看到頁面上的任何JS錯誤? –

+0

計時器是如何實現的? – Goose

回答

3

與此simplyfied版本

string message = "File is already open. <br>Please close the file and try again."; 
ScriptManager.RegisterClientScriptBlock(
    UpdatePanel1, // replace UpdatePanel1 by your UpdatePanel id 
    UpdatePanel1.GetType(), // replace UpdatePanel1 by your UpdatePanel id 
    "alert", 
    string.Format("alert('{0}');",message), 
    true); 
+0

工作表示感謝。但它不承認
作爲新行。這是什麼標籤? – user1468537

+0

@ user1468537:用'\ n'替代'
'。警報框不理解html。 –

+0

上面的代碼工作,如果我自己在button_click()上,但如果我把它放在一個catch字段(它仍然在button_click()方法中),它不再有效。任何想法爲什麼?我可以通過捕獲部分一路追蹤,它確實進入。 – user1468537

2

你沒有任何編碼在這裏:如果消息是你好讓貞德(注意單引號),你最終會用下面的代碼

sb.Append(message); 

alert('Hello Jean d'Arc'); 

我正在離開你想象一下這個=> javascript錯誤的結果當然。

要解決此錯誤,請確保您已正確編碼參數。要做到這一點的方法之一是JSON序列化:

var serializer = new JavaScriptSerializer(); 
sb.AppendFormat("alert({0});", serializer.Serialize(message)); 

此外,由於你已經includeed的<script>代碼,請確保您傳遞false作爲RegisterClientScriptBlock函數的最後一個參數,以避免增加他們兩次:

ClientScript.RegisterClientScriptBlock(
    this.GetType(), 
    "alert", 
    sb.ToString(), 
    false   // <!---- HERE 
); 

這裏是完整的代碼可能看起來怎麼樣:

var message = "File is already open. <br>Please close the file and try again."; 
var sb = new StringBuilder(); 
sb.Append("<script type=\"text/javascript\">"); 
sb.Append("window.onload=function() {"); 
var serializer = new JavaScriptSerializer(); 
sb.AppendFormat("alert({0});", serializer.Serialize(message)); 
sb.Append("};"); 
sb.Append("</script>"); 
ClientScript.RegisterClientScriptBlock(
    this.GetType(), 
    "alert", 
    sb.ToString(), 
    false 
); 

另一個要點是,如果你是在一個AJAX做這個給你打電話應該使用ClientScript.RegisterStartupScript方法。

+0

雖然你的建議對於通用場景是完全有效的,但在這種情況下的消息是經過編碼的,並且沒有'''。 –

+0

我只是指出了我用這段代碼看到的所有錯誤和缺陷。消息硬編碼的事實並不能解除硬編碼的義務。因爲下一個開發者只是修改了這個消息,所以會帶來非常糟糕的驚喜:-)我也指出這些缺陷,因爲SO是一個很好的參考網站,許多開發者都會去尋求知識。在做代碼審查時,我看到很多人犯這些錯誤,這些錯誤是很難找到的錯誤的根源。 –

+0

點,只是想說,缺乏編碼不會導致這個問題。你的回答非常完整並且非常感謝。 –