默认情况下,Razor会对字符串进行编码。是否有无需编码的特殊语法用于渲染?
自 ASP.NET MVC 3 起,您可以使用:
@Html.Raw(myString)
@(new HtmlString(myString))
除了已经提到的使用@Html.Raw(string)方法外,如果你输出一个MvcHtmlString类型的值,那么它将不会被编码。这在向HtmlHelper中添加自己的扩展或从视图模型返回可能包含html的值时非常有用。
例如,如果你的视图模型是:
public class SampleViewModel
{
public string SampleString { get; set; }
public MvcHtmlString SampleHtmlString { get; set; }
}
对于Core 1.0+(和MVC 5+),请使用HtmlString
public class SampleViewModel
{
public string SampleString { get; set; }
public HtmlString SampleHtmlString { get; set; }
}
然后
<!-- this will be encoded -->
<div>@Model.SampleString</div>
<!-- this will not be encoded -->
<div>@Html.Raw(Model.SampleString)</div>
<!-- this will not be encoded either -->
<div>@Model.SampleHtmlString</div>
谨慎使用@Html.Raw()
,因为它可能会导致编码和安全方面的更多问题。我理解使用场景,因为我自己也不得不这样做,但需要小心处理...只保留/转换特定字符序列并始终对其余部分进行编码,例如:
@Html.Raw(Html.Encode(myString).Replace("\n", "<br/>"))
那么你就可以放心,因为你没有制造潜在的安全漏洞,并且任何特殊/外文字符在所有浏览器中都能正确显示。
在ActionLink的情况下,通常会对链接文本使用HttpUtility.Encode进行编码。
在这种情况下,
您可以使用
HttpUtility.HtmlDecode(myString)
当我使用HtmlActionLink解码想要传递的字符串时,它对我起了作用。例如:
@Html.ActionLink(HttpUtility.HtmlDecode("myString","ActionName",..)
你还可以使用WriteLiteral方法
"'<>
等字符,它们将被转义。正确的方法是使用 MvcHtmlString,它将允许 "非法" 字符。例如,如果你要编码 Json 数据... 而不是对整个模型进行编码。 - Daniel B. Chapman"myAttr='hello';myInt=10"
- serge