.Net Core 1.1 中 HttpUtility.JavaScriptStringEncode 的等价物在哪里?
Posted
技术标签:
【中文标题】.Net Core 1.1 中 HttpUtility.JavaScriptStringEncode 的等价物在哪里?【英文标题】:Where is the equivalent of HttpUtility.JavaScriptStringEncode in .Net Core 1.1? 【发布时间】:2017-03-11 06:40:42 【问题描述】:我发现自己需要清除用户在 .Net Core MVC 应用程序中添加的 cmets 中的 javascript。在以前的框架中,这可以通过首先将字符串传递给 JavaScriptStringEncode 来实现。
var comment = HttpUtility.JavaScriptStringEncode(model.Comment);
但是,我无法在 .net 核心中找到等效项。
【问题讨论】:
你可以通过它的父母调用它来使用相同的方法:@System.Web.HttpUtility.JavaScriptStringEncode(YourStringHere) 【参考方案1】:这是 .net 核心中 HttpUtility.JavaScriptStringEncode
的等价物:
using System.Text.Encodings.Web; //part of System.Text.Encodings.Web nuget package
...
var encodedText = JavaScriptEncoder.Default.Encode("TextToEncode");
【讨论】:
【参考方案2】:在视图中有一个helper 可用作@Json.Serialize
。它使用 JSON.Net,考虑到 Startup.cs 中配置的任何格式选项:
var foo = @Json.Serialize(model);
请记住,这默认情况下不会对 json 进行 XSS 清理!但是,您可以使用允许您执行此操作的重载,将 JSON.Net 的 StringEscapeHandling
选项指定为 Escapehtml
:
@using Newtonsoft.Json
...
var foo = @Json.Serialize(model, new JsonSerializerSettings StringEscapeHandling = StringEscapeHandling.EscapeHtml );
您可以将其包装到您自己的助手中,例如 @Json.SafeSerialize
或 @SafeJson.Serialize
。
我还没有找到比您自己的助手更好的方法,而无需通过 Startup 中的 json 选项强制默认的 JsonOutputFormatter 以这种方式运行:
services.AddMvc().AddJsonOptions(opts => opts.SerializerSettings.StringEscapeHandling = StringEscapeHandling.EscapeHtml)
后一种方法的问题(以及您可能更喜欢自定义帮助程序的原因)是它还会影响从您的 API 返回的 JSON。
附言。我在github 上提出了这个问题。
【讨论】:
【参考方案3】:你可以使用同样的方法,像剃刀上的这个例子一样使用它:
@System.Web.HttpUtility.JavaScriptStringEncode(YourStringHere)
更新:
正如@Dai 所说,这只有在你的目标是 .NET Framework 时才有效,而 ASP.NET Core 不鼓励使用它。
【讨论】:
这在 .NET Core 中不起作用,因为System.Web.dll
不可用。如果您的目标是 .NET Framework 而不是 .NET Core,并且您的项目引用 System.Web.dll
(不鼓励使用 ASP.NET Core),这仅适用于 ASP.NET Core。
这在最新的核心版本中完美运行以上是关于.Net Core 1.1 中 HttpUtility.JavaScriptStringEncode 的等价物在哪里?的主要内容,如果未能解决你的问题,请参考以下文章
在 .NET Core 1.1 中获取应用程序数据目录的跨平台方式