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


81

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

为了简单起见,请坚持使用以下简单案例:

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

Answers:



17

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

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

希望在未来的Razor中有一种更简单的方法。

如果您不使用MVC,则可以尝试以下操作:

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

2
其实你是前人的精力能够使用new HtmlString()在MVC 3以及因为该类型是.NET 4
marcind

确实!但是,在一个表达式中键入所有内容时,我又更喜欢MVC。例如@ MvcHtmlString.Create(myString)。个人喜好!
2010年

6

新的HtmlString绝对是答案。

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

但是,我们可以将其包装成一个助手。可能...

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

要么

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

1
是否可以添加@ = myString作为输出HTML的方法?也许太多的回闪到WebForms ...
10

2
我们希望避免在不涵盖主要用例的地方添加语法构造。大多数情况下,您将使用辅助方法来构建字符串,而IHtmlString在那里可以完美工作。对于需要在没有帮助者的情况下输出文字字符串的奇怪情况,我们可以为您提供一种方法:@Literal(foo)或类似方法。
Andrew Stanton-Nurse

0

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

我最终要做的是实现一个与cshtml文件内部的View并行的RawView。本质上,要获取原始字符串,

@(new HtmlString(View.Foo))

// became
@RawView.Foo

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

@RawView["Foo"]

偶尔需要有人用键列表遍历数据。

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


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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.