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

时间:2010-07-28 19:41:40

标签: asp.net razor html-encode

正如ScottGu在他的博客中所说post«默认情况下,使用@ block发出的内容会自动进行HTML编码,以更好地防范XSS攻击情况» 我的问题是:如何输出非HTML编码的字符串?

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

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

5 个答案:

答案 0 :(得分:109)

这是我最喜欢的方法:

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

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

答案 1 :(得分:17)

您可以创建一个新的MvcHtmlString实例,它不会被HTML编码。

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

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

如果您没有使用MVC,可以试试这个:

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

答案 2 :(得分:6)

新的HtmlString绝对是答案。

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

然而,我们可能将其包装成一个帮手。可能...

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

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

答案 3 :(得分:0)

在将项目转换为新的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 :(得分:0)

我在Mono下使用ASP.NET MVC和Razor。

由于某些原因,我无法从System.Web.Mvc的System.Web.WebPages获取HtmlHelper。

但是在将模型的属性声明为#When I post my form def create folder_url = "https://drive.google.com/drive/folders/" spreadsheet_path = "https://docs.google.com/XXX" #Connect to the Drive API with credentials json file session = GoogleDrive::Session.from_config("#{ENV['CONFIG_PATH']}/config.json") test_dev = session.collection_by_url("#{folder_url}XXX") folder = test_dev.create_subcollection(params[:title]) #Get match between doc title and spreadsheet data worksheets = retrieve_spreadsheet_datas(session, spreadsheet_path).drop(1) worksheets.each do |row| name = row[1] + " " + row[2] if name == params[:title] #row[3] and row[4] contain link like "https://drive.google.com/open?id=XXX" if row[3] != nil create_folder(session, folder.web_view_link, 1, row[3]) end if row[4] != nil create_folder(session, folder.web_view_link, 2, row[4]) end end end redirect_to("/drive/index") end def retrieve_spreadsheet_datas(session, spreadsheet_path) spreadsheet = session.spreadsheet_by_url(spreadsheet_path) worksheet = spreadsheet.worksheets.first worksheet.rows end def create_folder(session, url, i, file) collection = session.collection_by_url(url) #Open collection col_folder = collection.create_subcollection("R#{i}") #Create subcollection in it col_folder_content = session.collection_by_url(col_folder.web_view_link) #Open the new collection #And here I want to upload "file (row[3] and row[4])" in "col_folder_content" end 之后,我设法输出了未编码的字符串。现在它会按预期输出。

示例

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>