在 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 "quotes"</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 视图中发出未编码的字符串的主要内容,如果未能解决你的问题,请参考以下文章
在javascript字符串内的asp razor视图中铸造模型