如何将编码标记呈现为正确的HTML,而不是文本?

22

我从数据库中获取到以下文本:(由客户提供,所以我无法进行太多处理)

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

它被渲染为:

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

我不想在屏幕上打印出<BR />标签,我希望它们能够表现为实际的换行符。

以下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(),编码过的标签 - /&gt;&lt; - 会被写入屏幕。我该如何确保我拥有的源文本以HTML格式呈现标签,而不是文本?


1
我假设你的意思是“如果我对助手方法的输出进行**HtmlDecode()**”。如果是这样,那么我的答案就是解决方案。否则,你正在对已经编码过的字符串进行双重编码,而Steve Wellens的答案是你首先需要的。 - Chev
6个回答

33
如果您正在使用Razor,它会像@Chevex所描述的那样对您的字符串进行双重编码。如果您使用新的MVC3 <%: %>语法,它也会对其进行双重编码。无论您使用的是哪种视图引擎,您都可以通过使用IHtmlString路由(例如MvcHtmlString)或通过使用不同的模板语法来绕过编码。后一种方法不需要更改任何代码,只需要调整您用于呈现视图的语法即可。
对于Razor:
@Html.Raw(yourvariable)

MVC 的默认视图模板系统:

<%=yourvariable%>

太棒了!对我非常有用! - imdadhusen

19

尝试这个:

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

    String Output = Server.HtmlDecode(Input);

我尝试使用这个。虽然我看不到其他 HTML 标签,但我仍然看到 <p> 标签。 - CodeNinja
我不确定你在问什么。请发布一个新问题,包括输入、输出、你正在做什么以及你想要的输出是什么。 - Steve Wellens

10

将返回值的div.ToString()更改为MvcHtmlString.Create(div.ToString()),并将方法返回类型更改为MvcHtmlString而不是string。这将防止视图引擎自动编码输出。

通过辅助方法呈现HTML输出,返回MvcHtmlString是标准实践。

发生的情况是您正在从数据库中解码值,并且在呈现时视图引擎会重新对其进行编码。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输出选项,不是吗? - ProfK

6
您可以尝试这样做:
 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
您实际上需要使用Html.Decode(string)。这将把编码的字符如&lt;转换为<

1

仅就我在这个问题上的发现进行补充,因为我曾经苦于以这种方式使用×。

SetInnerText() 默认会对所有文本进行 HTML 编码,而 InnerHtml 则不会对任何内容进行编码,因为它期望的是原始的 HTML。

因此,如果我理解得正确,您需要先解码文本字符串,以获取未编码的标记(即 <br/>),然后将其设置到 InnerHtml 属性中,标记将被呈现为 HTML。

所以你会有类似这样的东西

element.InnerHtml = Server.HtmlDecode(yourText);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接