gpt4 book ai didi

asp.net - TextWriter 引用的行为不符合预期

转载 作者:行者123 更新时间:2023-12-02 10:46:29 26 4
gpt4 key购买 nike

好吧,我正在使用 ILSpy 进行巡查,并试图弄清楚这里发生了什么,但我运气不太好。

在使用 Razor 引擎的 ASP.NET MVC4 应用程序中的给定 View 中(但这当然适用于 MVC3,可能是 2), OutputStack 继承自 WebPageBase 的属性(property)只是一堆 TextWriter 对象。

通过从该堆栈中压入和弹出,可以操纵给定 Razor View 的输出。我希望通过 HTML 帮助器扩展方法来利用它,但是我也注意到 ViewContext ,它也是 HtmlHelper 的公共(public)成员有它自己的TextWriter

现在,我进行了快速检查:(从 View 内)

@object.ReferenceEquals(this.ViewContext.Writer, this.OutputStack.Peek()) // True

但是,以下内容让我非常困惑:

@{
// push one on
OutputStack.Push(new StringWriter());
}
Hello!
@{
// capture everything and pop it
string buffer1 = OutputStack.Peek().ToString();
OutputStack.Pop();
}
<pre>@(buffer1)</pre>

@{
// apparently it references the top of the OutputStack
// so this should be essentially the same
var oldWriter = ViewContext.Writer;
ViewContext.Writer = new StringWriter();
}
World!
@{
// revert it and hope for the best
string buffer2 = ViewContext.Writer.ToString();
ViewContext.Writer = oldWriter;
}
<pre>@(buffer2)</pre>

以上结果如下:

  • Hello!被捕获到 buffer1 ,实际上在 <pre>Hello!</pre> 之后被转储。这既是预料之中的,也是所希望的。
  • World!另一方面,立即输出,后跟一个空的 <pre></pre>堵塞;换句话说,它没有捕获任何东西。

我的问题如下:这些TextWriter怎么办?对象相互关联,为什么我不能通过 ViewContext 管理引用就像我从 OutputStack 的顶部可以看到的一样? (相反,我如何通过 ViewContext 管理引用?)

<小时/>

附录
我遇到的细节和其他废话。

  • Writer ViewContext的属性(property)不会丢弃传递给 setter 的值,因此在第二个示例的情况下它不仅仅是丢弃它。
  • 沿着调用堆栈移动,OutputStack实际上来自 PageContext .
  • ViewContext.Writer设置于WebViewPage.ExecutePageHierarchy()使用WebViewPage属性(property)Output这是 OutputStack 的顶部! (只有我这样,还是这开始看起来像一个依赖关系的老鼠巢?)

最佳答案

我发布我的评论作为答案。它可能会解决您问题的学术部分,但它肯定会解决问题的实际部分,最重要的是您试图解决的最初问题。

在你的助手中,你可以获得当前 View 的OutputStack:

public static void MyHelper(this HtmlHelper html)
{
var stack = ((WebPageBase)html.ViewDataContainer).OutputStack;

... you could push and pop here and solve your real world problem
}

关于asp.net - TextWriter 引用的行为不符合预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17557732/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com