ASP.NET MVC剃刀渲染没有编码
Razor默认编码string。 有没有编码没有任何特殊的语法渲染?
自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; } }
然后
<!-- 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来解码我想传递的string。 例如:
@Html.ActionLink(HttpUtility.HtmlDecode("myString","ActionName",..)
您也可以使用WriteLiteral方法
HTML RAW:@ Html.Raw(yourString)