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)
。这将把编码字符如
转换为将returndiv.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.<BR /><BR /> blah blah blah";
String Output = Server.HtmlDecode(Input);
如果您使用的是Razor,它会将您的字符串双重编码为@Chevex。如果使用新的MVC3
语法,它还将对其进行双重编码。无论您的视图引擎如何,您都可以使用@Chevex描述的IHtmlString路由(例如,MvcHtmlString)或使用不同的模板语法绕过默认编码来处理编码
后者不涉及更改任何代码,只需要调整用于渲染到视图的语法
剃须刀:
@Html.Raw(yourvariable)
对于MVC的默认视图模板系统:
<%=yourvariable%>
您可以尝试以下方法:
String Input = "<p>New Appartments is Avaliable at very Reasonable Price</p>";
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 = "<p>New Appartments is Avaliable at very Reasonable Price</p>";
String Output = Server.HtmlDecode(Input);
string _output = System.Text.RegularExpressions.Regex.Replace(Output, "<.*?>", string.Empty);
element.InnerHtml = Server.HtmlDecode(yourText);