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 回答