2016-05-26 2 views
2

В RC1 у меня был следующий небольшой метод, который сработал.asp.net core 1.0 mvc RC2 tagBuilder метод с HtmlEncoder() работал в RC1 не работает RC2

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

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

     return writer.ToString(); 
    } 

Как показано в методе, он преобразует тег Tagbuilder в строку с помощью stringWriter().

Я получаю ошибку на «новом HtmlEncoder()» и ошибка:

Не удается создать экземпляр абстрактного класса или интерфейса «HtmlEncoder»

я нашел this на HtmlEncoder в преломлении разделе Asp.Net/Announcements изменения, однако я не могу понять, как изменить его на работу ..

Как реорганизовать:

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

, так что я могу преобразовать тег в строку?

ответ

3

HtmlEncoder теперь является абстрактным классом и не может быть инициализирован (see HttpEncoder.cs на dotnet\corefx GitHub repository).

У этого есть реализация по умолчанию (DefaultHtmlEncoder), которая является внутренней. Но HtmlEncoder предоставляет статическое свойство Default, которое ссылается на его реализацию по умолчанию, see HttpEncoder.cs.

Таким образом, вместо того, чтобы звонить new HtmlEncoder(), вы просто звоните HtmlEncoder.Default. Я думаю, что это попытка оптимизации, чтобы не инициализировать HtmlEncoder несколько раз за запрос.

+0

Хотя я считаю, что это правильный ответ, у меня возникли проблемы с его реализацией. Можно ли привести пример, используя мой простой метод выше? Я, кстати, получил свой первоначальный ответ от [здесь] (http://stackoverflow.com/questions/33667308/convert-ihtmlcontent-tagbuilder-to-string-in-c-sharp) и, в частности, ответ @Phasiq. – si2030

+1

Извините, это было поздно ночью и имело тип. 'HtmlEncoder.Default' - это то, что вы называете. т. е. «Tag.WriteTo (writer, HtmlEncoder.Default)», который использует стандартную реализацию. – Tseng

3

Используйте инъекцию зависимости для получения активного (настроенного) экземпляра HtmlEncoder.

Кодировщик может быть сконфигурирован (в Startup), чтобы не кодировать некоторые символы Юникода (кириллица и т. Д.), А DefaultHtmlEncoder.Singletonencodes everything except UnicodeRanges.BasicLatin.

+0

Вы можете передать конфигурацию только через конструктор, а 'DefaultHtmlEncoder' отмечен как внутренняя печать. Какой другой класс реализует абстрактный класс HttpEncoder? Вчера я только нашел классы, связанные с модулем, – Tseng

+0

Да, 'DefaultHtmlEncoder' является' internal sealed', но не 'HtmlEncoder' сам - вы можете заменить стандартную версию собственной реализации через DI в' Startup.cs'. Кроме того, ['public static HtmlEncoder.Create'] (https://github.com/dotnet/corefx/blob/release/1.0.0/src/System.Text.Encodings.Web/src/System/Text/Encodings/ Web/HtmlEncoder.cs # L31) позволяет создать новый экземпляр 'DefaultHtmlEncoder' с пользовательскими' TextEncoderSettings' – Dmitry

Смежные вопросы