1

HtmlHelper にContentとの 2 つの拡張機能を追加しましBlockた。 消費者がかみそりコード Contentから作成できるようにします。ユーザーがヘッダーとコンテンツ セクションを含む html ブロッ​​クを作成できるようにします。パラメータが using ブロック内でコンパイルされない理由を理解しようとしています。とてもきれいに見えると思うので、using ブロックの使用を維持したいと思います。2 番目の引数をに変更せずにこれをコンパイルする方法はありますか?HtmlStringsBlockrazorContentBlockHtmlString

かみそり:

@* uses of Html.Content compiles as expected *@
@Html.Content(@<span>foo</span>)
@{
    IHtmlString htmlString = Html.Content(@<span>bar</span>);
}
@htmlString


@* "@<span>header</span>" does not compile
 *
 * expected markup: 
 * <div class="header">
 *     <span>header</span>
 * </div>
 * <div class="content>
 *     <span>content</span>
 * </div>
 *@
@using (Html.Block(@<span>header</span>))
{
    <span>content</span>
}

拡張子:

public static class HtmlHelperExtensions
{
    public static IHtmlString Content(this HtmlHelper htmlHelper, Func<object, HelperResult> razorContent)
    {
        var content = razorContent(null);
        return content;
    }

    public static IDisposable Block(this HtmlHelper htmlHelper, Func<object, HelperResult> razorContent)
    {
        var content = razorContent(null);
        return new MyHtmlBlock(htmlHelper, content);
    }
}

MyHtmlBlock:

public class MyHtmlBlock : IDisposable
{
    private readonly TextWriter _writer;
    private readonly TagBuilder _contentTag;

    public MyHtmlBlock(HtmlHelper htmlHelper, IHtmlString header)
    {
        this._writer = htmlHelper.ViewContext.Writer;

        var headerTag = new TagBuilder("div");
        headerTag.AddCssClass("header");
        headerTag.InnerHtml = header.ToHtmlString();

        this._contentTag = new TagBuilder("div");
        this._contentTag.AddCssClass("content");

        this._writer.Write(headerTag);
        this._writer.Write(this._contentTag.ToString(TagRenderMode.StartTag));
    }
    public void Dispose()
    {
        this._writer.Write(this._contentTag.ToString(TagRenderMode.EndTag));
    }
}
4

0 に答える 0