asp.net|asp.net 網頁中用TextBox讓使用者輸入文本,然後存入資料庫,再從資料庫中讀出顯示在頁面上。常常這樣做會遇到不少問題,因為TextBox實際上是一個Windows組件,和網頁顯示標記如:<p>,<td>,<div>等,對字元的解析方法是不同的。比如前者的換行標記為“\r\n”,而後者為“<br>”。這就帶來一個轉換的問題。
在做轉換之前,先來考慮幾個問題:
1、 TextBox用“\r\n”來標記換行而網頁中以“<br>”標記
2、 網頁中連續的空格當做一個空格處理,比如“a b c”將會顯示“a b c”
3、 使用者輸入特殊字元比如:“<”,“&”,“ ”,“<”,這些都是網頁中有特殊意義的字元,會被解析,而使用者輸入的目的當然是不希望被解析。
現在來解決這幾個問題,有一種解決辦法是在顯示的時候仍然用TextBox去顯示,這樣就不用做任何轉換,只要把TextBox.ReadOnly設為true,這樣在一定程度上能滿足要求。但是往往為了網頁的美觀,這樣做是不可取的。比較好的辦法是去解析使用者輸入的字串,可以做這樣的轉換:
第一步:
“<” à“<”
“&” à“&”
“ ”à“ ”
……(此處的省略符號後文有說明)
第二步:
“ ” à“ ”
“\r\n” à“<br>”
這裡必須分兩步轉換,因為如果你先做第二步轉換的話混把使用者輸入的特殊字元串和由轉換而的的特殊字元串混淆,比如:
使用者輸入:a b c d
第二步轉換:a b c d
第一步轉換:a b c d
可以看到,經過第一次轉換後已經無法分辨使用者輸入的“ ”和轉換而來的“ ”,在做第二次轉換的時候就會統一處理就會出錯。結果顯示:a b c d
如果嚴格按照第一步,第二步的轉換順序來轉換就不會出現這個問題。
把轉換後的字串存入資料庫,在顯示的時候直接把從資料庫讀出的字串給HTML組件賦值,比如:
//這裡假設temp是從資料庫中讀出來的,這裡示範Table和HtmlTable其他的控制項類似
//顯示的效果是:<a b
//Table1是Web控制項
String temp = “<a b”;
Table1.Rows[0].Cells[0].Text = temp;
//Table2是HTML控制項
Table2.Rows[0].Cells[0].InnerHtml = temp;
HtmlTable有兩個相似的屬性“InnerHtml”,“InnerText”,介紹一下這兩個屬性的區別:
InnerHtml:顯示的時候會對傳入的值進行HTML解析,就像上面的例子。
InnerText:顯示的時候不會對傳入的值新型解析,直接把傳入的值顯示出來。比如把上面的例子改成:Table2.Rows[0].Cells[0].InnerText = temp;那麼顯示的效果將會變成:<a b
雖然這兩個屬性用起來很方便,似乎可以滿足平時的使用需求,但是InnerText有兩個問題:
1、 無法標記換行,不管是“\r\n”還是“<br>”都不是換行標記
2、 連續的空格仍然只顯示一個空格。
所以想不轉換字串而直接用InnerText是不可取的。但是轉換是個非常繁瑣的過程,因為HTML的特殊標記非常多。值得慶幸的是ASP.NET提供了HttpServerUtil類,該類提供了HtmlEncode()和HtmlDecode()方法,這裡我們只用到HtmlEncode()方法。我們就可以這樣來轉換:
//“\r\n”在TextBox中硬斷行符號的時候會自動添上
string temp = “a b c d\r\ne<”;
//Server是Page類的一個屬性,也就是說任何aspx頁面的codebehind中都是可以使用的
//因為aspx頁面都是繼承Page類的。
temp = Server.HtmlEncode(temp);
temp = temp.Replace(" "," ");
temp = temp.Replace("\r\n","<br>");
Table1.Rows[0].Cells[0].Text = temp;
Table2.Rows[0].Cells[0].InnerHtml = temp;
//顯示效果:a b c d
// e<
到這裡你也許會想一個問題,萬一使用者輸入“\r\n”怎麼辦?不用擔心,網頁組件的設計者已經考慮到了這個問題,因為使用者輸入的“\r\n”會被自動轉換成“\\r\\n”(當然在我們做轉換之前)。
大功告成:)