在 Razor 视图中发出未编码的字符串

Posted

技术标签:

【中文标题】在 Razor 视图中发出未编码的字符串【英文标题】:Emitting unencoded strings in a Razor view 【发布时间】: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...

【问题讨论】:

【参考方案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)。个人喜好!

以上是关于在 Razor 视图中发出未编码的字符串的主要内容,如果未能解决你的问题,请参考以下文章

razor page (blazor) 正在对字符进行编码

在 ASP.NET 5 中将 Razor 视图呈现为字符串

ASP MVC Razor 在输入占位符中编码特殊字符

在javascript字符串内的asp razor视图中铸造模型

在 ASP.NET Core 中将 Razor 视图渲染为字符串

如何在Razor视图中选择SelectListItem