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