データに改行コードが入っているのにGridViewで改行しない
SQL Serverのストアドプロシーシャーを使って改行コードの入っているデータを生成して、GridViewで表示しようとしたが改行されない。
そこで、ストアドプロシージャで改行コードを<br>タグに変換して表示させようとしたところ、今度はブラウザで○○○<br>○○○やと表示されてしまう。
サーバー環境
OS | windows |
アプリケーションサーバー | iis |
データベース | SQL Server |
開発環境
OS | windows |
開発ツール | visual studio c# |
ブラウザの種別 | 指定なし |
GridViewで改行できない理由
<br>タグはブラウザに対して制御コードになります。
その為、GridViewは悪意のあるHTMLタグ、JavaScript、SQL文などが解釈・実行されることを防ぐ為に制御コードを無害化します。
その事をサニタイジング(エスケープ)と言います。
GridViewのサニタイジングの有効/無効はHtmlEncodeプロパティーでコントロールできるはずなんですが、ストアドプロシージャからデータを取得する時はうまく行きません。
viewを使ってデータを取得する時はこれでうまく行くんですが、ストアドプロシージャからデータを取得する時は、このプロパティーは無視されるようです。
GridViewで改行させる方法
c#では改行コードに'\n'を使うので、そのコードが来たらプログラムで<br>タグに変換します。
データ変換はGridViewのRowDataBoundイベントで、一行毎のデータがバインドされた時に拾います。
row.Cells[i].Text.Replace("\\n", "<br />");
これで、改行コードが<br>タグに書き換えます。
Replaceで第1パラメータが'\\n'になっているのば、正規表現で\は特殊文字として取り扱われるので、\nを探す時は\\nで表現します。
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
GridViewRow row = e.Row;
if (e.Row.RowType == DataControlRowType.DataRow)
{
for (int i = 0; row.Cells.Count>i; i++)
{
//System.Diagnostics.Debug.WriteLine(row.Cells[i].Text);
row.Cells[i].Text = row.Cells[i].Text.Replace("\\n", "<br/>");
}
}
}