首页 文章

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

提问于
浏览
232

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

7 回答

  • 52

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

    @Html.Raw(myString)
    
  • 10
    @(new HtmlString(myString))
    
  • 0

    除了已经提到的@ Html.Raw(字符串)方法,如果输出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>
    
  • 350

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

    @Html.Raw(Html.Encode(myString).Replace("\n", "
    "))

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

  • 4

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

    @Html.ActionLink(HttpUtility.HtmlDecode("myString","ActionName",..)
    
  • 29

    您还可以使用WriteLiteral方法

  • 1

    HTML RAW:

    @Html.Raw(yourString)
    

相关问题