ASP.NET MVC Razor无需编码即可呈现

Sib*_*Guy 243 .net c# asp.net asp.net-mvc razor

Razor默认编码字符串.没有编码的渲染是否有任何特殊语法?

Luc*_*cas 365

从ASP.NET MVC 3开始,您可以使用:

@Html.Raw(myString)
Run Code Online (Sandbox Code Playgroud)

  • 这不完全正确.是的,你可以插入一个原始字符串但是如果你有`''<>等......这些将被转义.正确的方法是使用允许"非法"字符的MvcHtmlString.例如,如果你是编码Json数据......无需编码整个模型 (8认同)
  • Daniel,[Html.Raw()](http://msdn.microsoft.com/en-us/library/gg480740.aspx)"返回非HTML编码的标记." (4认同)
  • 它不编码报价.除了明显的文档说明它是白天(_"这个方法使用IHtmlString类包装HTML标记,它呈现**未编码的**HTML."_)我也测试了这个并且引号没有编码. (4认同)

Mat*_*nes 57

@(new HtmlString(myString))
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!这适用于MVC2,它没有Html.Raw()! (3认同)

Jon*_*att 31

除了已经提到的@ Html.Raw(字符串)方法,如果输出MvcHtmlString,它将不会被编码.在将自己的扩展添加到HtmlHelper时,或者从您知道可能包含html的视图模型中返回值时,这非常有用.

例如,如果您的视图模型是:

public class SampleViewModel
{
  public string SampleString { get; set; }
  public MvcHtmlString SampleHtmlString { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

对于Core 1.0+(和MVC 5+),使用HtmlString

public class SampleViewModel
{
  public string SampleString { get; set; }
  public HtmlString SampleHtmlString { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后

<!-- 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>
Run Code Online (Sandbox Code Playgroud)


Ton*_*all 10

@Html.Raw()谨慎使用,因为编码和安全性可能会带来更多麻烦.我理解用例,因为我必须自己做,但要小心......只是避免允许所有文本通过.例如,仅保留/转换特定字符序列,并始终对其余字符进行编码:

@Html.Raw(Html.Encode(myString).Replace("\n", "<br/>"))
Run Code Online (Sandbox Code Playgroud)

然后,您可以放心,您没有创建潜在的安全漏洞,并且在所有浏览器中都能正确显示任何特殊/外来字符.


gut*_*guy 5

对于ActionLink,通常在链接文本上使用HttpUtility.Encode。在这种情况下HttpUtility.HtmlDecode(myString) ,当使用HtmlActionLink解码要传递的字符串时,可以使用 它为我工作。例如:

  @Html.ActionLink(HttpUtility.HtmlDecode("myString","ActionName",..)
Run Code Online (Sandbox Code Playgroud)