前言
在動態輸出Javascript的時候我們習慣用Response.write("<script language=\"javascript\" type=\"text/javascript\">alert(1);</script>");這樣的語句來動態輸出,但是你可能沒注意到裡面的格式問題,比如,我測試連接數據庫,如果連接失敗就打印catch信息,但是你會發現你直接輸出是輸出不了的,會報錯,比如字符串沒有結束之類的腳本錯誤。
正文
一、普通輸出問題分析、測試
1.我們先來看一段代碼:
/// <summary>
/// 連接接數據庫
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnConnect_Click(object sender, EventArgs e)
{
try
{
///此處填寫連接數據庫的代碼
}
catch (Exception ex)
{
Response.Write(Alert(string.Concat("連接失敗!!出錯原因:", ex.Message)));
}
}
/// <summary>
/// 彈出信息
/// <script language="javascript" type="text/javascript">
/// alert(msg);
/// </script>
/// </summary>
/// <param name="msg"></param>
/// <returns></returns>
public static string Alert(string msg)
{
return Javascript(string.Concat("alert('",msg,"');"));
}
/// <summary>
/// 輸出Javascript代碼
/// <script language="javascript" type="text/javascript">
/// alert("彈出框例子!");
/// </script>
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public static string Javascript(string context)
{
return string.Concat("<script language=\"javascript\" type=\"text/javascript\">", context, "</script>"); ;
}
說明分析:這裡調用方法btnConnect_Click讓他衡失敗,比如連接字符串錯誤,這裡假設連接字符串為:Data Source=.\;Initial Catalog=test;User ID=sa;Password=sa 。那麼調試時ex.Message信息會顯示"無法打開登錄 'test' 中請求的數據庫。登錄失敗。\r\n用戶 'sa' 登錄失敗。",那麼現在我可以很肯定的告訴你,你直接輸出肯定會報Javascript錯誤,顯示" 確實')' ",跟蹤發現它輸出的字符串如下:
<script language="javascript" type="text/javascript">alert('連接失敗!!出錯原因:無法打開登錄 'test' 中請求的數據庫。登錄失敗。
用戶 'sa' 登錄失敗。');</script>
我們把這代碼直接復制到ASPX頁面裡,果然報錯,而且錯誤也比較明顯了,alert輸出的信息不在一行上,也不支持C# 的'@' ,問題就出在這裡了!!