82

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

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

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

5 回答 5

114

这是我最喜欢的方法:

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

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

于 2011-02-07T22:47:28.637 回答
17

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

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

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

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

@{
  var html = new HtmlString("<a href='#'>Click me</a>")
}
于 2010-07-28T20:46:19.763 回答
6

new HtmlString 绝对是答案。

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

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

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

或者

@"<p>something</p>".AsHtml()
于 2010-07-29T01:15:05.010 回答
0

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

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

@(new HtmlString(View.Foo))

// became
@RawView.Foo

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

@RawView["Foo"]

万一有人需要使用键列表遍历数据。

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

于 2010-08-18T22:21:19.967 回答
0

我在 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>
于 2019-02-05T13:11:43.540 回答