正如ScottGu在他的博客中所说post«默认情况下,使用@ block发出的内容会自动进行HTML编码,以更好地防范XSS攻击情况» 我的问题是:如何输出非HTML编码的字符串?
为了简单起见,请坚持这个简单的案例:
@{
var html = "<a href='#'>Click me</a>"
// I want to emit the previous string as pure HTML code...
}
答案 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>