正如ScottGu在他的博客文章中所说,“默认情况下,使用@块发出的内容将自动进行HTML编码,以更好地防御XSS攻击情况”。我的问题是:如何输出非HTML编码的字符串?
为了简单起见,请坚持使用以下简单案例:
@{
var html = "<a href='#'>Click me</a>"
// I want to emit the previous string as pure HTML code...
}
Answers:
这是我最喜欢的方法:
@Html.Raw("<p>my paragraph text</p>")
来源是Phil Haack的Razor语法参考:http : //haacked.com/archive/2011/01/06/razor-syntax-quick-reference.aspx
新的HtmlString绝对是答案。
我们研究了其他一些剃刀的语法更改,但最终它们最终都没有比新的HtmlString短。
但是,我们可以将其包装成一个助手。可能...
@Html.Literal("<p>something</p>")
要么
@"<p>something</p>".AsHtml()
在将我们的项目过渡到新的Razor视图引擎时,我也遇到了这个问题。我采用的方法略有不同,因为我们必须从C#生成JSON数据,并希望在页面加载时将其输出。
我最终要做的是实现一个与cshtml文件内部的View并行的RawView。本质上,要获取原始字符串,
@(new HtmlString(View.Foo))
// became
@RawView.Foo
这需要对项目布局进行一些更改,因此我只是在此处撰写了一篇有关它的博客文章。简而言之,这需要MVC的DynamicViewDataDictionary的重复实现以及包含RawView的新WebViewPage。我还继续在RawView上实现了索引运算符,以允许
@RawView["Foo"]
偶尔需要有人用键列表遍历数据。
阅读anurse的评论,如果我将其命名为Literal而不是RawView,那可能会更好。
我正在使用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 "quotes"</div>
new HtmlString()
在MVC 3以及因为该类型是.NET 4