在Razor视图中发出未编码的string

正如ScottGu在博客中所说:“默认情况下,使用@块发射的内容会自动进行HTML编码,以更好地防止XSS攻击情况”。 我的问题是:你怎么能输出一个非HTML编码的string?

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

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

这是我最喜欢的方法:

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

来源是菲尔·哈克的剃刀语法参考: http : //haacked.com/archive/2011/01/06/razor-syntax-quick-reference.aspx

您可以创build一个MvcHtmlString的新实例,它将不会得到HTML编码。

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

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

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

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

新的HtmlString绝对是答案。

我们研究了一些其他的剃刀语法变化,但最终没有一个比新的HtmlString更短。

但是,我们可能会把这件事情变成一个帮手。 也许…

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

要么

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

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

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

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

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

 @RawView["Foo"] 

在这种情况下,有人需要用一系列密钥来遍历数据。

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