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

C# 如何将编码的标记呈现为正确的HTML,而不是文本?,c#,html,asp.net-mvc,encoding,C#,Html,Asp.net Mvc,Encoding,我从数据库中得到以下文本:(由客户提供,所以我不能做太多) 将其渲染为: investment professionals.<BR /><BR /> blah blah blah 如果我Html.Encode()helper方法的输出,则编码的标记-/-将写入屏幕。如何获取我拥有的源文本并确保标记呈现为HTML而不是文本?您实际上想要使用HTML.Decode(string)。这将把编码字符如转换为将returndiv.ToString()更改为MvcHtmlStrin

我从数据库中得到以下文本:(由客户提供,所以我不能做太多)

将其渲染为:

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

如果我
Html.Encode()
helper方法的输出,则编码的标记-
/
-将写入屏幕。如何获取我拥有的源文本并确保标记呈现为HTML而不是文本?

您实际上想要使用
HTML.Decode(string)
。这将把编码字符如
转换为
将return
div.ToString()
更改为
MvcHtmlString.Create(div.ToString())
,方法返回类型改为
MvcHtmlString
。这将阻止视图引擎自动编码输出

返回
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());
}
试试这个:

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

    String Output = Server.HtmlDecode(Input);

如果您使用的是Razor,它会将您的字符串双重编码为@Chevex。如果使用新的MVC3
语法,它还将对其进行双重编码。无论您的视图引擎如何,您都可以使用@Chevex描述的IHtmlString路由(例如,MvcHtmlString)或使用不同的模板语法绕过默认编码来处理编码

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

剃须刀:

@Html.Raw(yourvariable)
对于MVC的默认视图模板系统:

<%=yourvariable%>

您可以尝试以下方法:

 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);
String Input=“p新公寓价格非常合理/p”;
字符串输出=Server.HtmlDecode(输入);
string _output=System.Text.RegularExpressions.Regex.Replace(输出“”,string.Empty);

我只是想把我的发现添加到这个问题上,因为我正努力以这种方式使用×

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

因此,如果我的方法正确,您必须首先解码文本字符串以获得未编码的标记(即

),然后将其设置为InnerHtml属性,标记将呈现为html

所以你会有类似的

element.InnerHtml = Server.HtmlDecode(yourText);

我假设您的意思是“如果我
HtmlDecode()
helper方法的输出…”。如果你这样做了,那么我的答案就是解决方案。否则,您将对已经编码的字符串进行双重编码,Steve Wellens的答案是您首先需要的。非常好!这对我很有用!当然一个标记生成器应该有一个
MvcHtmlString
输出选项吗?我试过使用这个选项。我仍然可以看到标记,尽管我没有看到其他html标记?我不知道你在问什么。请发布一个新问题,包括输入、输出、你正在做什么以及你想要的输出是什么。
 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);
element.InnerHtml = Server.HtmlDecode(yourText);