程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> ASP.NET 動態輸出Javascript 文本格式換行問題

ASP.NET 動態輸出Javascript 文本格式換行問題

編輯:.NET實例教程

前言

   在動態輸出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' 中請求的數據庫。登錄失敗。rn用戶 'sa' 登錄失敗。",那麼現在我可以很肯定的告訴你,你直接輸出肯定會報Javascript錯誤,顯示" 確實')' ",跟蹤發現它輸出的字符串如下:

<script language="Javascript" type="text/Javascript">alert('連接失敗!!出錯原因:無法打開登錄 'test' 中請求的數據庫。登錄失敗。
用戶 'sa' 登錄失敗。');</script>

   我們把這代碼直接復制到ASPX頁面裡,果然報錯,而且錯誤也比較明顯了,alert輸出的信息不在一行上,也不支持C# 的'@' ,問題就出在這裡了!!

   二、解決辦法[參考帖子:http://topic.csdn.Net/u/20080505/15/3b9c038d-f82d-429f-b093-00e92fdca295.Html]

   修改後的代碼如下,Javascript方法不變,僅僅修改Alert方法,代碼如下:

        /// <summary>
        /// 彈出信息
        ///     <script language="Javascript" type="text/Javascript">
        ///         alert(msg);
        ///     </script>
        /// </summary>
        /// <param name="msg"></param>
        /// <returns></returns>
        public static string Alert(string msg)
        {
            StringBuilder Html = new StringBuilder();
            msg = msg.Replace("'"," ");
            Html.AppendLine();
            Html.Append("   var msg = '';");
            Html.App
endLine();
            for (int i = 0, j = msg.Length; i < j;)
            {
                if (i + 10 <= j)
                {
                    Html.Append("msg+='");
                    Html.Append(msg.Substring(i, 10).Replace(System.Environment.NewLine, string.Empty));
                    Html.Append("';");
                    Html.AppendLine();
                    i += 10;
                }
                else
                {
                    Html.Append("msg+='");
                    Html.Append(msg.Substring(i).Replace(System.Environment.NewLine, string.Empty));
                    Html.Append("';");
                    Html.AppendLine();
                    break;
                }
            }
            Html.Append("alert(msg);");
            return Javascript(Html.ToString());
        }


   代碼說明:大家注意紅色的代碼部分,是代碼的關鍵,替換信息內所含的換行,自己手動增加換換行符號,並且拼接字符串,防止字符串過長。測試後,跟蹤調試輸出字符串如下:

<script language="Javascript" type="text/Javascript">
   var msg = '';
msg+='連接失敗!!出錯原因';
msg+=':無法打開登錄  t';
msg+='est  中請求的數';
msg+='據庫。登錄失敗。';
msg+='用戶  sa  登錄';
msg+='失敗。';
alert(msg);</script>

   現在OK了!!!

  結束

   又整了我一上午,不容易啊 :)

  補充

 如果輸出信息包含n 或r 之類的信息,請在字符串傳入的時候加上@符號,防止輸出被轉義!!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved