Как отобразить закодированные теги как правильный HTML, а не как текст? - PullRequest
22 голосов
/ 15 марта 2011

Я получаю следующий текст из базы данных: (предоставляется клиентом, поэтому я не могу ничего с этим поделать)

investment professionals.<BR /><BR /> blah blah blah

, который отображается как:

investment professionals.<BR /><BR /> blah blah blah

Я не хочу печатать теги <BR /> на экране.Я хочу, чтобы они вели себя как настоящие перерывы.

Следующий код Html Helper создает диапазон, в котором он существует, добавляет его в div и возвращает строку HTML:

StringBuilder sbElements = new StringBuilder();

TagBuilder span = new TagBuilder("span") {InnerHtml = subject.AboutText};
sbElements.Append(span.ToString());

TagBuilder div = new TagBuilder("div");
div.MergeAttribute("class", "about-text");
div.InnerHtml = sbElements.ToString();

return div.ToString();

Если I Html.Encode(), вывод метода помощника,закодированные теги - /&gt;&lt; - записываются на экран.Как я могу взять исходный текст, который у меня есть, и убедиться, что теги отображаются как HTML, а не как текст?

Ответы [ 6 ]

32 голосов
/ 15 марта 2011

Если вы используете Razor, он будет дважды кодировать вашу строку, как описано @Chevex. Если вы используете новый синтаксис MVC3 <%: %>, он также будет кодировать его дважды. Независимо от вашего движка просмотра вы можете обойти кодировку либо с помощью маршрута IHtmlString (например, MvcHtmlString), описанного @Chevex, либо обходя кодировку по умолчанию, используя другой синтаксис шаблона.

Позднее, которое не требует изменения какого-либо кода, просто требуется настроить синтаксис, который вы используете для рендеринга в представление.

Для бритвы:

@Html.Raw(yourvariable)

Для системы шаблонов представления MVC по умолчанию:

<%=yourvariable%>
19 голосов
/ 15 марта 2011

Попробуйте это:

    String Input = "investment professionals.&lt;BR /&gt;&lt;BR /&gt; blah blah blah";

    String Output = Server.HtmlDecode(Input);
10 голосов
/ 15 марта 2011

Измените return div.ToString() на MvcHtmlString.Create(div.ToString()) и тип возврата метода на MvcHtmlString вместо string. Это предотвратит автоматическое кодирование вывода механизмом представления.

Возвращение MvcHtmlString - это стандартная практика для рендеринга вывода HTML с помощью вспомогательных методов.

То, что происходит, - это то, что вы декодируете значение из базы данных, и механизм представления перекодирует его, когда оно отображается. Механизм представления Razor автоматически кодирует выходные данные HTML в ваших представлениях, если это не MvcHtmlString. Возвращение MvcHtmlString остановит это.

public static MvcHtmlString MyNonHtmlEncodedOutput(this HtmlHelper html)
{
        StringBuilder sbElements = new StringBuilder();

        TagBuilder span = new TagBuilder("span") {InnerHtml = Server.HtmlDecode(subject.AboutText)};
        sbElements.Append(span.ToString());

        TagBuilder div = new TagBuilder("div");
        div.MergeAttribute("class", "about-text");
        div.InnerHtml = sbElements.ToString();

        return MvcHtmlString.Create(div.ToString());
}
6 голосов
/ 04 апреля 2012

Вы можете попробовать это:

 String Input = "&lt;p&gt;New Appartments is Avaliable at very Reasonable Price&lt;/p&gt;";
 String Output = Server.HtmlDecode(Input);
 string _output = System.Text.RegularExpressions.Regex.Replace(Output, "<.*?>", string.Empty);
2 голосов
/ 15 марта 2011

Вы действительно хотите использовать Html.Decode(string). Это преобразует закодированные символы, такие как &lt; в <.

1 голос
/ 24 июня 2012

Просто чтобы добавить мои выводы к этому вопросу, поскольку я изо всех сил пытался использовать & времена; таким образом.

SetInnerText () будет html кодировать весь текст по умолчанию, тогда как InnerHtml ничего не кодирует, поскольку он ожидает необработанный html.

Так что, если я правильно понял, вам придется сначала декодировать текстовую строку, чтобы получить некодированные теги (т.е. <br/>), а затем установить это в свойство InnerHtml, и теги будут отображаться как HTML.

чтобы у вас было что-то вроде

element.InnerHtml = Server.HtmlDecode(yourText);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...