HTMLヘルパーを自作してみる

見様見真似でHTMLヘルパーを書いてみました。
F#で書かれた例を見かけなかったので、参考までに投稿しておきます。


ひとつ注意点があります。
F#で定義する際に、型拡張ではなく拡張メソッドとして記述します。*1
System.Runtime.CompilerServices.ExtensionAttribute を付与してあげてください。
そして、関数の第一引数はHtmlHelper型であることを明示します。

namespace FsWeb.Helpers

open System
open System.Web
open System.Web.Mvc
open System.Runtime.CompilerServices

[<Extension>]
module SampleHelper =

    [<Extension; CompiledName("CodeBlock")>]
    let createCodeBlock(_:HtmlHelper, code) =
        let builder = TagBuilder("pre")
        builder.MergeAttribute("style", "border: 1px black solid;"
                                      + "background-color: #eeeeee;"
                                      + "padding: 10px;"
                                      + "font: 1.2em Consolas;")
        builder.InnerHtml <- code
        builder.ToString() |> MvcHtmlString.Create

スタイルを直に指定していますが、サンプルということで大目に見てください・・・。


ビューのほうは、こんな感じです。

@using FsWeb.Helpers
(中略)
@Html.CodeBlock("let inline (|>) x f = f x")


ブラウザでは以下のように出力されます。


おしまい。

*1:別クラスとして定義する場合はその限りではない