パーシャル、セクション、ヘルパーなどの標準的なアプローチを使用する代わりに、なぜホイールを再発明したいのかわかりませんが、おそらくいくつかの理由があると思います。したがって、表示した構文とは異なりますが、2つのヘルパーを組み合わせて使用することで同様の結果を得ることができます。
public static class HtmlExtensions
{
private const string QueueKey = "_output_queue_";
public static IHtmlString WriteLater(this HtmlHelper htmlHelper, Func<object, HelperResult> action)
{
var queue = htmlHelper.ViewContext.HttpContext.Items[QueueKey] as Queue<Func<object, HelperResult>>;
if (queue == null)
{
queue = new Queue<Func<object, HelperResult>>();
htmlHelper.ViewContext.HttpContext.Items[QueueKey] = queue;
}
queue.Enqueue(action);
return MvcHtmlString.Empty;
}
public static IHtmlString WriteNow(this HtmlHelper htmlHelper)
{
var queue = htmlHelper.ViewContext.HttpContext.Items[QueueKey] as Queue<Func<object, HelperResult>>;
if (queue == null)
{
return MvcHtmlString.Empty;
}
var writer = htmlHelper.ViewContext.Writer;
foreach (var item in queue)
{
item(null).WriteTo(writer);
}
return MvcHtmlString.Empty;
}
}
これは次のように使用できます。
@Html.WriteLater(@<div>output line one</div>)
<div>actual first line</div>
@Html.WriteLater(@<div>output line two</div>)
<div>actual second line</div>
@Html.WriteNow()
そして、出力は期待されるものになります:
actual first line
actual second line
output line one
output line two