ASP.NETのバインディング構文に関してインラインデータバインディング構文のメモ でまとめましたのですが、バインディング構文に : (コロン) をつけると HTML エンコードして出力をしてくれます。ASP.NETにはかなり長い時間かかわっているはずなのですが、つい最近知りました。
検証環境
- ASP.NET 4.5
簡単なサンプルWebフォームを作成して動作確認をしてみます。
たとえば、次のような Webフォーム(aspx) を作成します。サンプルフォームのバインディング構文で <%# と <%: の2パターンでマークアップを生成するようにしています。
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApp.WebForm1" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> </head> <body> <form id="form1" runat="server"> <div> <asp:Repeater runat="server" ID="rptRepater" ItemType="WebApp.TestModel"> <ItemTemplate> <div> :がないバージョン - バインドされた文字列にマークアップがあってもそのまま出力される(HTMLとして解釈される) <asp:Label runat="server" Text="<%# Item.Text %>" ID="Label1" /> </div> <div> <b>:があるバージョ</b>ン - バインドされた文字列に マークアップがあると エンコードされる(文字列として出力される) <br /><br /> <asp:Label runat="server" Text="<%#: Item.Text %>" ID="Label2" /> </div> </ItemTemplate> <SeparatorTemplate> <hr /> </SeparatorTemplate> </asp:Repeater> </div> </form> </body> </html>
サンプルのコードビハインドファイル(cs)は次のように作成します。コードビハインドファイルで Repeater コントロールにバインドするデータソースを作成しているだけです。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace WebApp { public partial class WebForm1 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { rptRepater.DataSource = TestModel.GenerateSample(); rptRepater.DataBind(); } } public class TestModel { public string Text { get; set; } public static IList<TestModel> GenerateSample() { List<TestModel> data = new List<TestModel>(); data.Add(new TestModel { Text = "<h1 style='background-color:Green'>hello world</h1>" }); data.Add(new TestModel { Text = "<h2 style='background-color:Yellow'>こんにちは 世界</h2>" }); return data; } } }
実行すると次のような結果になります。 <%# でバインドした場所はそのまま文字列が出力され HTMLのマークアップとして認識されています。一方 <%#: とコロンをつけた方は HTMLエンコードされて文字列として画面に出力されるようになります。
バインディング構文にコロンをつけることで簡単にjavascript インジェクション対策が行えるようになります。素敵です。
さんのコメント: さんのコメント: