【问题标题】:Emitting unencoded strings in a Razor view在 Razor 视图中发出未编码的字符串
【发布时间】:2011-03-22 08:53:57
【问题描述】:

正如 ScottGu 在他的博客 post 中所说,“默认情况下,使用 @ 块发出的内容会自动进行 HTML 编码,以更好地防止 XSS 攻击场景”。 我的问题是:如何输出非 HTML 编码的字符串?

为了简单起见,请坚持这个简单的案例:

@{
 var html = "<a href='#'>Click me</a>"
 // I want to emit the previous string as pure HTML code...
}

【问题讨论】:

    标签: asp.net razor html-encode


    【解决方案1】:

    我在 Mono 下使用 ASP.NET MVC 和 Razor。

    由于某些原因,我无法从 System.Web.Mvc 的 System.Web.WebPages 获取 HtmlHelper。

    但是在将模型的属性声明为RazorEngine.Text.RawString 后,我设法输出了未编码的字符串。现在它按预期输出。

    例子

    @{
        var txt = new RawString("some text with \"quotes\"");
        var txt2 = "some text with \"quotes\"";
    }
    <div>Here is unencoded text: @txt</div>
    <div>Here is encoded text: @txt2</div>
    

    输出:

    <div>Here is unencoded text: some text with "quotes"</div>
    <div>Here is encoded text: some text with &quot;quotes&quot;</div>
    

    【讨论】:

      【解决方案2】:

      这是我最喜欢的方法:

      @Html.Raw("<p>my paragraph text</p>")
      

      来源是 Phil Haack 的 Razor 语法参考:http://haacked.com/archive/2011/01/06/razor-syntax-quick-reference.aspx

      【讨论】:

        【解决方案3】:

        在将我们的项目转换到新的 Razor 视图引擎时,我也遇到了这个问题。我采用的方法略有不同,因为我们必须从 C# 生成 JSON 数据,并希望在页面加载时输出它。

        我最终所做的是在 cshtml 文件中实现一个与 View 平行的 RawView。本质上,要获取原始字符串,

        @(new HtmlString(View.Foo))
        
        // became
        @RawView.Foo
        

        这需要对项目布局进行一些更改,所以我刚刚写了一篇关于它的博客文章here。简而言之,这需要 MVC 的 DynamicViewDataDictionary 的重复实现和包含 RawView 的新 WebViewPage。我还继续在 RawView 上实现了索引运算符以允许

        @RawView["Foo"]
        

        如果有人需要使用键列表循环数据。

        阅读 anurse 的评论,如果我将其命名为 Literal 而不是 RawView,可能会更好。

        【讨论】:

          【解决方案4】:

          new HtmlString 绝对是答案。

          我们研究了其他一些 razor 语法更改,但最终没有一个比 new HtmlString 更短。

          然而,我们可以将它包装成一个助手。可能……

          @Html.Literal("<p>something</p>")
          

          @"<p>something</p>".AsHtml()
          

          【讨论】:

          • 是否可以添加 @=myString 作为输出 HTML 的一种方式?对 WebForms 的回忆可能太多了……
          • 我们希望避免在不涵盖主要用户案例的情况下添加语法结构。大多数时候,您将使用辅助方法来构建字符串,而 IHtmlString 在那里可以完美地工作。对于需要在没有助手的情况下输出文字字符串的奇怪情况,我们可以为您提供一种方法:@Literal(foo) 或类似的。
          【解决方案5】:

          您可以创建一个不会进行 HTML 编码的 MvcHtmlString 的新实例。

          @{
            var html = MvcHtmlString.Create("<a href='#'>Click me</a>")
          }
          

          希望 Razor 的未来会有更简单的方法。

          如果你没有使用 MVC,你可以试试这个:

          @{
            var html = new HtmlString("<a href='#'>Click me</a>")
          }
          

          【讨论】:

          • 实际上您应该能够在 MVC 3 中使用 new HtmlString(),因为该类型是 .NET 4。
          • 确实!但是,当在一个表达式中输入所有内容时,我更喜欢 MVC。例如。 @MvcHtmlString.Create(myString)。个人喜好!
          猜你喜欢
          • 2011-05-09
          • 2015-08-30
          • 1970-01-01
          • 1970-01-01
          • 2014-10-28
          • 2014-05-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多