gpt4 book ai didi

c# - Razor:自定义 BeginForm()-like Razor 一次性 block 在某些情况下不起作用

转载 作者:太空狗 更新时间:2023-10-29 19:45:39 25 4
gpt4 key购买 nike

我有一个 block 的自定义实现,它的工作方式很像 Html.BeginForm() .实现基本如下:

public class MyBlock : IDisposable {
private readonly HtmlHelper _html;

public MyBlock(HtmlHelper hml) {
this._html.ViewContext.Writer.WriteLine("BEGIN");
}

public void Dispose() {
this._html.ViewContext.Writer.WriteLine("END");
}
}

那么在我看来我可以这样做:

@using (new MyBlock(Html)) {
@: some content
}

得到:

BEGIN
some content
END

一切正常。但是,当我在“ Razor 片段”中使用我的 block 时遇到了麻烦,例如。 G。将一些 Razor 内容传递给采用 Func<object, HelperResult> 的函数时作为论据。例如,我有另一个 HtmlHelper 函数定义如下:

public static IHtmlString Content(this HtmlHelper @this, Func<object, HelperResult> razor) {
return razor(null);
}

@* use in a view as: *@
@{
var razorContent = Html.Content(@<div>Some razor content</div>);
}
@razorContent

但是,当我执行以下操作时,内部内容在没有外部内容的情况下呈现:

@{ 
var content =Html.Content(
@<text>
@using (new MyBlock(Html)) {
@: some content 2
}
<text>
);
}
@content

我认为问题在于“Html”仍然指的是外部上下文的 HtmlHelper,因此 BEGIN 和 END 被发送给与“某些内容 2”不同的作者,但是,我不确定这是不是情况。

有谁知道 (1) 出了什么问题以及 (2) 我该如何解决?

最佳答案

您的问题的部分解决方案是调用 HelperResult 的 WriteTo 方法。您可以将 Content 方法更改为如下内容:

public static void Content(this HtmlHelper @this, Func<object, HelperResult> razor)
{
razor(null).WriteTo(@this.ViewContext.Writer);
}

然后这样使用它:

@{ Html.Content(
@<text>
@using (new MyBlock(Html)) {
@: some content 2
}
</text>
);
}

编辑

如果你想以 IHtmlString 或任何其他字符串的形式返回值,你可以这样做:

public static IHtmlString Content(this HtmlHelper @this, Func<object, HelperResult> razor)
{
using (MemoryStream ms = new MemoryStream())
using (TextWriter tw = new StreamWriter(ms))
{
Delegate @delegate = (Delegate)razor;
WebViewPage target = (WebViewPage)@delegate.Target;
TextWriter tmp = target.Html.ViewContext.Writer;
try
{
target.Html.ViewContext.Writer = tw;
razor(null).WriteTo(tw);
tw.Flush();
ms.Seek(0, SeekOrigin.Begin);
TextReader tr = new StreamReader(ms);

return MvcHtmlString.Create(tr.ReadToEnd());
}
finally
{
target.Html.ViewContext.Writer = tmp;
}
}
}

关于c# - Razor:自定义 BeginForm()-like Razor 一次性 block 在某些情况下不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14129921/

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