【问题标题】:asp.net core 1.0 mvc RC2 tagBuilder method with HtmlEncoder() worked in RC1 not working RC2带有 HtmlEncoder() 的 asp.net core 1.0 mvc RC2 tagBuilder 方法在 RC1 中工作不工作 RC2
【发布时间】:2016-05-26 01:35:23
【问题描述】:

在 RC1 中,我使用了以下有效的小方法。

    public string ConvertTagToSring(TagBuilder Tag)
    {
        var writer = new StringWriter();

        Tag.WriteTo(writer, new HtmlEncoder());

        return writer.ToString();
    }

正如该方法所示,它使用 stringWriter() 将 Tagbuilder 标记转换为字符串。

我在“new HtmlEncoder()”上收到一个错误,错误是:

无法创建抽象类或接口“HtmlEncoder”的实例

我在 Asp.Net/Announcements 的重大更改部分的 HtmlEncoder 上找到了this,但是我不知道如何将其更改为工作..

我该如何重构:

Tag.WriteTo(writer, new HtmlEncoder());

以便我可以将标签转换为字符串?

【问题讨论】:

    标签: asp.net-core asp.net-core-mvc


    【解决方案1】:

    HtmlEncoder 现在是一个抽象类,不能初始化(dotnet\corefx GitHub repository 上的see HttpEncoder.cs)。

    它有一个默认实现 (DefaultHtmlEncoder),它是内部的。但是HtmlEncoder 公开了一个静态属性Default,它引用了它的默认实现see HttpEncoder.cs。

    因此,您无需调用new HtmlEncoder(),只需调用HtmlEncoder.Default。我想这是一种优化尝试,以避免每个请求多次初始化HtmlEncoder。

    【讨论】:

    • 虽然我相信这是正确的答案,但我在实施它时遇到了一些麻烦。可以用我上面的简单方法举个例子吗?我顺便从here 得到了我的原始答案,尤其是@Phasiq 的答案。
    • 抱歉来晚了,有类型。 HtmlEncoder.Default 就是你所说的。即Tag.WriteTo(writer, HtmlEncoder.Default);,它使用默认实现。
    【解决方案2】:

    使用依赖注入获取活动(已配置)HtmlEncoder 实例。

    编码器可以配置(在Startup中)不编码一些unicode字符(西里尔文等),而DefaultHtmlEncoder.Singletonencodes everything except UnicodeRanges.BasicLatin。

    【讨论】:

    • 您只能通过构造函数传递配置,DefaultHtmlEncoder 标记为内部密封。哪个其他类实现了HttpEncoder抽象类?昨天才找到单元测试相关的类
    • 是的,DefaultHtmlEncoder 是 internal sealed,但不是 HtmlEncoder 本身 - 您可以通过 Startup.cs 中的 DI 用自己的实现替换默认值。此外,public static HtmlEncoder.Create 允许您使用自定义 TextEncoderSettings 创建新的 DefaultHtmlEncoder 实例
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 2016-04-24
    • 2016-10-23
    相关资源
    最近更新 更多