【问题标题】:How to render encoded tags as proper HTML, rather than text?如何将编码标签呈现为正确的 HTML,而不是文本?
【发布时间】:2011-07-15 22:57:38
【问题描述】:

我正在从数据库中获取以下文本:(由客户提供,因此我无能为力)

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

呈现为:

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

我不想在屏幕上打印&lt;BR /&gt; 标签。我希望他们表现得像真正的休息。

以下 Html Helper 代码构建它所在的 span,将其添加到 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();

如果我 Html.Encode() 辅助方法的输出,编码标签 - /&amp;gt;&amp;lt; - 被写入屏幕。如何获取我拥有的源文本并确保标签呈现为 HTML,而不是文本?

【问题讨论】:

  • 我假设您的意思是“如果我 HtmlDecode() 辅助方法的输出...”。如果你这样做了,那么我的答案就是解决方案。否则,您将对已编码的字符串进行双重编码,而 Steve Wellens 的答案是您首先需要的。

标签: c# html asp.net-mvc encoding


【解决方案1】:

如果您使用的是 Razor,它将按照@Chevex 的描述对您的字符串进行双重编码。如果您使用新的 MVC3 &lt;%: %&gt; 语法,它也会对其进行双重编码。无论您的视图引擎如何,您都可以使用 @Chevex 描述的 IHtmlString 路由(例如 MvcHtmlString)或使用不同的模板语法绕过默认编码来解决编码问题。

后者不涉及更改任何代码,只需要调整用于呈现到视图的语法。

对于剃刀:

@Html.Raw(yourvariable)

对于MVC的默认视图模板系统:

<%=yourvariable%>

【讨论】:

  • 太棒了!对我很有用!
【解决方案2】:

试试这个:

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

    String Output = Server.HtmlDecode(Input);

【讨论】:

  • 我试过用这个。我仍然看到

    标签,虽然我没有看到其他 html 标签。 ?

  • 我不确定你在问什么。请发布一个新问题,包括输入、输出、您在做什么以及您想要的输出是什么。
【解决方案3】:

将返回 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());
}

【讨论】:

  • 该死的TagBuilder 应该有MvcHtmlString 输出选项吗?
【解决方案4】:

你可以试试这个:

 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);

【讨论】:

    【解决方案5】:

    您实际上想使用Html.Decode(string)。这会将&amp;lt; 等编码字符转换为&lt;

    【讨论】:

      【解决方案6】:

      只是将我的发现添加到这个问题中,因为我正在努力以这种方式使用 ×。

      SetInnerText() 默认情况下会对所有文本进行 html 编码,而 InnerHtml 不会对任何内容进行编码,因为它需要原始 html。

      因此,如果我以正确的方式解决此问题,则必须首先解码文本字符串以获取未编码的标签(即&lt;br/&gt;),然后将其设置为 InnerHtml 属性,标签将呈现为html.

      所以你会有类似的东西

      element.InnerHtml = Server.HtmlDecode(yourText);
      

      【讨论】:

        猜你喜欢
        • 2017-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-27
        • 2018-01-08
        • 2012-09-11
        相关资源
        最近更新 更多