アレがアレでアレ

(できれば)プログラミング関係のことを書きたい

ASP.NET MVC HTMLヘルパーのメモ

ASP.NET MVCには簡単にビューにHTMLをレンダリングできるHTMLヘルパーというものがあります。 Html.Action(), Html.Lavel(), Html.Editor()とか

自作のHTMLヘルパーをHtmlHelperクラスの拡張メソッドとして追加することで、元からあるメソッドと同じようにHtml.で呼び出して使うことができるのでそのメモです。

試しに引数として受け取ったstringのリストを使って、HTMLの順序なしリストを返すHTMLヘルパーを定義してみます。

拡張メソッド

using System.Web;
using System.Web.Mvc;

namespace App.Helpers
{
    public static class HtmlHelperExample
    {
        public static IHtmlString ListItem(this HtmlHelper helper, IEnumerable<string> items)
        {
            string li = "";
            foreach (var item in items)
                li += $"<li>{HttpUtility.HtmlAttributeEncode(item)}</li>";

            return MvcHtmlString.Create($"<ul>{li}</ul>");
        }
    }
}

View(呼び出し)

@Html.ListItem(new List<string> { "Apple", "Banana", "Orange", "Grape" })

<ul><li>Apple</li><li>Banana</li><li>Orange</li><li>Grape</li></ul>
  • HttpUtility.HtmlAttributeEncode(): 受け取った文字列をエスケープします。

注意する点はStringではなくIHtmlStringを返すところです。
IHtmlStringは「HTMLエンコード済みである」ことを表すオブジェクトです。 Stringで返してしまうとRazor側でエスケープ処理されてしまうので、「この文字列はエスケープ済み」ということをRazor側に知らせるためMvcHtmlString.Create()を使ってStringIHtmlStringに変換します。

おわり。