2010-11-01 12 views
133

我想寫使用剃刀對象爲JSON我Asp.Net MVC視圖,就像這樣:如何使用Razor將未編碼的Json寫入我的視圖?

<script type="text/javascript"> 
    var potentialAttendees = @Json.Encode(Model.PotentialAttendees); 
</script> 

的問題是,在輸出的JSON編碼,和我的瀏覽器不喜歡它。例如:

<script type="text/javascript"> 
    var potentialAttendees = [{&quot;Name&quot;:&quot;Samuel Jack&quot;},]; 
</script> 

如何讓Razor發出未編碼的JSON?

+2

+1了很好的問題。我正在尋找寫一個帖子來問這個,但你救了我打字.... – gyurisc 2011-10-17 13:15:46

回答

171

你這樣做:

@Html.Raw(Json.Encode(Model.PotentialAttendees)) 

在早於Beta 2的版本你是什麼樣子:

@(new HtmlString(Json.Encode(Model.PotentialAttendees))) 
+3

我可以做什麼,如果我想在我的對象屬性中的一些編碼文本? \,{\「UrlPart \」:\「TjcolklFX5c \」,\「Title \」:\「When Mama Isn \ Home \」},{\「 例如,這會打破因爲js認爲'正在逃避var a =''的本地字符串decalration,與「」相同。 anny idea? – SomeRandomName 2015-02-20 15:59:58

+0

@SomeRandomName您可以使用'javascriptserializer'來處理類似於 的@@ Html.Raw(javascriptSerializerObjecct.Serialize(myObject)) ' – vikscool 2017-04-21 07:30:02

+0

我們是在2017年,使用MVC 5,這個答案還是很完美的! – 2017-05-29 19:23:00

9

使用Newtonsoft

<script type="text/jscript"> 
    var potentialAttendees = @(Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model.PotentialAttendees))) 
</script> 
35

Newtonsoft的JsonConvert.SerializeObject不行爲一樣Json.Encode並做@ david-k-egghead建議打開你到XSS攻擊

將此代碼放入Razor視圖以查看使用Json.Encode是安全的,並且可以在JavaScript上下文中安全地使用Newtonsoft,但不是沒有額外的工作。

<script> 
    var jsonEncodePotentialAttendees = @Html.Raw(Json.Encode(
     new[] { new { Name = "Samuel Jack</script><script>alert('jsonEncodePotentialAttendees failed XSS test')</script>" } } 
    )); 
    alert('jsonEncodePotentialAttendees passed XSS test: ' + jsonEncodePotentialAttendees[0].Name); 
</script> 
<script> 
    var safeNewtonsoftPotentialAttendees = JSON.parse(@Html.Raw(HttpUtility.JavaScriptStringEncode(JsonConvert.SerializeObject(
     new[] { new { Name = "Samuel Jack</script><script>alert('safeNewtonsoftPotentialAttendees failed XSS test')</script>" } }), addDoubleQuotes: true))); 
    alert('safeNewtonsoftPotentialAttendees passed XSS test: ' + safeNewtonsoftPotentialAttendees[0].Name); 
</script> 
<script> 
    var unsafeNewtonsoftPotentialAttendees = @Html.Raw(JsonConvert.SerializeObject(
     new[] { new { Name = "Samuel Jack</script><script>alert('unsafeNewtonsoftPotentialAttendees failed XSS test')</script>" } })); 
    alert('unsafeNewtonsoftPotentialAttendees passed XSS test: ' + unsafeNewtonsoftPotentialAttendees[0].Name); 
</script> 

參見:

+0

當你添加Json.Encode時,你有什麼想法嗎?我不知道那裏有實際上是一種在頁面上插入json的安全方式,我知道我過去對此做了大量的研究。 – 2016-07-07 18:03:22

+1

'Json.Encode'一直存在,只要我記得,但缺點是它使用微軟的實現,輸出非標準日期(並可能做其他煩人的事情)。我使用並鼓勵使用Newtonsoft的'JsonConvert.SerializeObject'結合適當的轉義,因爲它具有更好的輸出。 – 2016-07-08 15:53:13

+2

很高興我滾動下來。我立即看到了接受的答案,我希望有一個安全的方法來做到這一點。 – frostymarvelous 2016-07-29 11:13:46