0

わかりました、これが私がやろうとしていることです...このかみそりのコードを考えると

@using(Html.WriteLater())
{
    output line one
}
actual first line
@using(Html.WriteLater())
{
    output line two
}
actual second line

@HTML.WriteNow();

この出力が欲しい:

actual first line
actual second line
output line one
output line two

ビュー内でコードのブロックを論理的にグループ化すると便利な場合がありますが、最終的な出力は別の方法で編成する必要があります。ヘルパーロジックで別のViewContextにアクセスしようとしましたが、機能しません。

public static WriteLaterContainer WriteLater( this HtmlHelper htmlHelper )
{
    ViewContext vc = new ViewContext();
    return new WriteLaterContainer( vc );
}
4

1 に答える 1

3

パーシャル、セクション、ヘルパーなどの標準的なアプローチを使用する代わりに、なぜホイールを再発明したいのかわかりませんが、おそらくいくつかの理由があると思います。したがって、表示した構文とは異なりますが、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
于 2012-06-28T20:58:51.160 に答える