2010-07-28 101 views
76

正如ScottGu在其博客中所說的post«默認情況下,使用@塊發射的內容會自動進行HTML編碼以更好地防止XSS攻擊情況»。 我的問題是:如何輸出一個非HTML編碼的字符串?在剃刀視圖中發出未編碼的字符串

爲了簡單起見,請堅持這個簡單的例子:

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

回答

17

您可以創建MvcHtmlString的一個新實例,它不會得到HTML編碼。

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

希望Razor未來會有更簡單的方法。

如果你不使用MVC,你可以試試這個:

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

其實你前人的精力能夠使用'新HtmlString()'在MVC 3,以及因爲該類型是.NET 4. – marcind 2010-07-28 23:19:22

+0

確實!然而,當在一個表達式中輸入所有內容時,我更喜歡MVC。例如。 @ MvcHtmlString.Create(myString的)。個人喜好! – aolde 2010-07-29 08:36:30

6

新HtmlString是絕對的答案。我們研究了一些其他的剃刀語法變化,但最終沒有一個變得比新的HtmlString短。

然而,我們可能會把它包裝到幫手中。也許......

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

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

是否可以添加@ = myString作爲輸出HTML的方式?也許太多閃回WebForms ... – aolde 2010-07-29 15:31:12

+2

我們希望避免在不包含主要用戶案例的地方添加語法結構。大多數情況下,您將使用幫助器方法來構建字符串,並且IHtmlString可以完美地工作。對於那些你需要輸出一個字符串沒有一個幫手奇數的情況下,我們可以提供給你一個方法:@Literal(富)或類似的。 – 2010-08-14 15:50:45

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,它可能會更好。