C# 如何在asp.net核心HtmlHelper扩展中使用IDisposable模式捕获内部内容

C# 如何在asp.net核心HtmlHelper扩展中使用IDisposable模式捕获内部内容,c#,asp.net-core,C#,Asp.net Core,我是ASP.NET核心的新手。 我正在尝试将旧项目迁移到ASP.NET core。 我们在分区内部使用了大量脚本块,这些脚本块集中呈现在布局的预定义位置。我们将HtmlHelper与所述的一次性模式一起使用。问题是,由于ASP.NET核心中的新体系结构,无法使用 webPageBase.OutputStack.Pop() 捕捉内容。我找到了类似的解决方案 但我仍然更愿意使用HtmlHelper扩展,以便在单个位置收集脚本逻辑和渲染。否则,我将需要编写2个标记帮助程序,协调它们,并将所有50-1

我是ASP.NET核心的新手。 我正在尝试将旧项目迁移到ASP.NET core。 我们在分区内部使用了大量脚本块,这些脚本块集中呈现在布局的预定义位置。我们将HtmlHelper与所述的一次性模式一起使用。问题是,由于ASP.NET核心中的新体系结构,无法使用

webPageBase.OutputStack.Pop()
捕捉内容。我找到了类似的解决方案
但我仍然更愿意使用HtmlHelper扩展,以便在单个位置收集脚本逻辑和渲染。否则,我将需要编写2个标记帮助程序,协调它们,并将所有50-100次出现的HtmlHelper扩展替换为标记帮助程序。

HTML帮助程序仍然是ASP.NET核心中的一个东西。仅仅因为标记帮助器是呈现自定义HTML的新的、通常更灵活的解决方案,这并不意味着HTML帮助器已经消失或者它们已经没有用处了。内置标记帮助程序实际上基于HTML帮助程序,并将使用相同的内部后端生成输出。所以它只是同一事物的不同接口

也就是说,由于ASP.NET Core呈现视图的方式,使用块捕获
中的内容要比在标记帮助程序(tag helpers)中的工作方式(这是一项非常通用的功能)困难一些

我已经在这个问题上坐了一段时间了,并得出了以下结论。只要块处于打开状态,就可以临时将视图编写器替换为
StringWriter
请注意,这可能是一个非常糟糕的想法。但它确实有效

公共静态类ScriptHtmlHelper
{
private const string ScriptsKey=“\uuu scripthtmlhelp\u Scripts”;
公共静态ScriptBlock BeginScript(此IHtmlHelper帮助程序)
{
返回新的脚本块(helper.ViewContext);
}
公共静态IHTML内容页面脚本(此IHTML帮助程序)
{
if(helper.ViewContext.HttpContext.Items.TryGetValue(ScriptsKey,out var scriptsData)&&scriptsData是列表脚本)
返回新的HtmlContentBuilder(脚本);
返回HtmlString.Empty;
}
公共类脚本块:IDisposable
{
私有ViewContext _ViewContext;
私人文本作者(原作者),;
私人编剧;
私人住宅;
公共脚本块(ViewContext ViewContext)
{
_viewContext=viewContext;
_originalWriter=viewContext.Writer;
//替换编写器
viewContext.Writer=_scriptWriter=新的StringWriter();
}
公共空间处置()
{
如果(_)
回来
尝试
{
列表脚本=null;
if(_viewContext.HttpContext.Items.TryGetValue(ScriptsKey,out var scriptsData))
scripts=scriptsData作为列表;
如果(脚本==null)
_viewContext.HttpContext.Items[ScriptsKey]=scripts=newlist();
添加(新的HtmlString(_scriptWriter.ToString());
}
最后
{
//还原原作者
_viewContext.Writer=\u originalWriter;
_这是真的;
}
}
}
}
用法如下:

@使用(Html.BeginScripts()){
console.log('foo');
console.log('bar');
}
@使用(Html.BeginScripts()){
console.log('baz');
}
然后渲染所有内容:

@Html.PageScripts()

您不使用脚本的原因是什么?是的。节不适用于具有不同层次结构的分部。