さらに一歩進んだLabelコントロール
BR以外にも、例えば「http://codezine.jp/」というURLが文章中に入っている場合に、自動的にリンクに変換したいといった要望があるかと思います。この場合は、以下のようなコードでURLをリンクに変換することができます。
public static string UrlToLink(string val) { Regex regex = new Regex( _ @"http:\/\/[a-zA-Z0-9\.\$\,\;\:\&\=\?\!\*\~\@\#_\(\)\-\%\/\+]+"); string tempstring = regex.Replace(val, delegate(Match match) { StringBuilder sb = new StringBuilder(); sb.Append("<a href=\""); sb.Append(match.Value); sb.Append("\">"); sb.Append(match.Value); sb.Append("</a>"); return sb.ToString(); }); return tempstring; }
Public Shared Function UrlToLink(ByVal val As String) As String Dim regex As New Regex( _ "http:\/\/[a-zA-Z0-9\.\$\,\;\:\&\=\?\!\*\~\@\#_\(\)\-\%\/\+]+") Dim tempstring As String = regex.Replace(val, _ New MatchEvaluator(AddressOf HttpLinktoAnchor)) Return tempstring End Function Public Shared Function HttpLinktoAnchor(ByVal match As Match) As String Dim sb As New StringBuilder() sb.Append("<a href=""") sb.Append(match.Value) sb.Append(""">") sb.Append(match.Value) sb.Append("</a>") Return sb.ToString() End Function
このメソッドも利用して、リンク変換とBR変換を同時に行うユーザコントロールSpecialLabelを作ってみましょう。
BR変換と、Link変換を行うかどうかの判断用にプロパティを作成します。
private bool BR変換_ = false; [DefaultValue(false)] public bool BR変換 { get { return BR変換_; } set { BR変換_ = value; } } private bool Link変換_ = false; [DefaultValue(false)] public bool Link変換 { get { return Link変換_; } set { Link変換_ = value; } }
Private BR変換_ As Boolean <DefaultValue(False)> _ Public Property BR変換() As Boolean Get Return Me.BR変換_ End Get Set(ByVal value As Boolean) Me.BR変換_ = value End Set End Property Private Link変換_ As Boolean <DefaultValue(False)> _ Public Property Link変換() As Boolean Get Return Me.Link変換_ End Get Set(ByVal value As Boolean) Me.Link変換_ = value End Set End Property
判断用のプロパティを見ながら変換を行っていくRenderContentsを作成します。
protected override void RenderContents(HtmlTextWriter writer) { //変換元stringを取り出す string temp = this.Text; //link変換する場合には変換ロジックを呼び出す if (this.Link変換 == true) { temp = UrlToLink(temp); } //BR変換する場合にはReplaceする if (this.BR変換 == true) { temp = temp.Replace("\r\n", "<br />"); } writer.Write(temp); }
Protected Overrides Sub RenderContents(ByVal output As HtmlTextWriter) '変換元stringを取り出す Dim temp As String = Me.Text 'link変換する場合には変換ロジックを呼び出す If (Me.Link変換 = True) Then temp = UrlToLink(temp) End If 'BR変換する場合にはReplaceする If (Me.BR変換 = True) Then temp = temp.Replace(vbNewLine, "<br />") End If output.Write(temp) End Sub
.aspxファイルにテスト用のコードを記述します。
SpecialLabelCS: <cc1:SpecialLabelCS ID="SpecialLabelCS1" runat="server" BR変換="True" Link変換="True" Text="http://codezine.jp/ http://www.wankuma.com"></cc1:SpecialLabelCS><br /> SpecialLabelVB: <cc2:speciallabelvb id="SpecialLabelVB1" runat="server" br変換="True" link変換="True" Text= "http://codezine.jp/ http://www.wankuma.com"></cc2:speciallabelvb>
実行結果は次のようになります。リンクの生成と、改行の設定が同時に行われていることを確認できました。

プロパティを変更することで、変換の有無を制御できるので、かなり使い勝手のよいラベルコントロールが出来上がりました。
おわりに
Webコントロールを一から自作しようとすると、かなり難しく高い壁のように思ってしまいます。しかし今回のように、既存のコントロールの挙動を変更する形での作成は、非常に簡単にできることが分かっていただけたのではないでしょうか。
ASP.NETの良さはそのコーディング量の少なさにあります。今回のコントロールを使ってデータバインディングを行うことにより、コーディング0を実現できます。ぜひ皆さんも、いろいろなWebカスタムコントロールを作成して、ASP.NETでのプログラミングをより便利にしてください。
