如何使用 Razor 将未编码的 Json 写入我的视图?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/4072762/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-03 17:37:53  来源:igfitidea点击:

How do I write unencoded Json to my View using Razor?

asp.net-mvcjsonrazor

提问by Samuel Hyman

I'm trying to write an object as JSON to my Asp.Net MVC View using Razor, like so:

我正在尝试使用 Razor 将对象作为 JSON 写入我的 Asp.Net MVC 视图,如下所示:

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

The problem is that in the output the JSON is encoded, and my browser doesn't like it. For example:

问题是在输出中对 JSON 进行了编码,而我的浏览器不喜欢它。例如:

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

How do I get Razor to emit unencoded JSON?

如何让 Razor 发出未编码的 JSON?

回答by Lorenzo

You do:

你做:

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

In releases earlier than Beta 2 you did it like:

在 Beta 2 之前的版本中,您是这样做的:

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

回答by Jeremy Cook

Newtonsoft's JsonConvert.SerializeObjectdoes not behave the same as Json.Encodeand doing what @david-k-egghead suggests opens you up to XSS attacks.

Newtonsoft 的JsonConvert.SerializeObject行为与Json.Encode@david-k-egghead 建议的做法不同,这会让您面临XSS 攻击

Drop this code into a Razor view to see that using Json.Encodeis safe, and that Newtonsoft can be made safe in the JavaScript context but is not without some extra work.

将此代码放入 Razor 视图以查看使用Json.Encode是安全的,并且 Newtonsoft 可以在 JavaScript 上下文中变得安全,但并非没有一些额外的工作。

<script>
    var jsonEncodePotentialAttendees = @Html.Raw(Json.Encode(
        new[] { new { Name = "Samuel Hyman</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 Hyman</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 Hyman</script><script>alert('unsafeNewtonsoftPotentialAttendees failed XSS test')</script>" } }));
    alert('unsafeNewtonsoftPotentialAttendees passed XSS test: ' + unsafeNewtonsoftPotentialAttendees[0].Name);
</script>

See also:

也可以看看:

回答by Ravi Ram

Using Newtonsoft

使用牛顿软件

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