ASP.NET站点乌克兰语文本传入JSON-LD微数据乱码问题求助
解决ASP.NET Razor中JSON-LD变量输出UTF-16乌克兰语转义问题
问题根源
Razor引擎默认会对@Model.str这类变量输出执行HTML编码,目的是防范XSS攻击,但在application/ld+json类型的script标签中,这种编码会将非ASCII的乌克兰语字符转成&#xXXXX;格式的实体,导致JSON内容异常。而直接写入的静态乌克兰语文本属于HTML静态内容,Razor不会对其编码;英文ASCII字符不在HTML编码范围内,因此两种方式输出都正常。
解决方案
方案1:使用Html.Raw()输出未编码字符串
直接通过Html.Raw()跳过Razor的HTML编码逻辑,输出原始的乌克兰语文本。注意:仅当Model.str的内容是可信的(无恶意脚本)时使用,避免引入XSS风险。
修改后的代码:
@model ListPlatformsVM @section Microdata { <script type="application/ld+json"> { "@context": "https://schema.org/", "@type": "BreadcrumbList", "itemListElement": [ { "@type": "ListItem", "position": "1", "name": "@Html.Raw(Model.str)", "item": "@Url.GetRouteUrl(EReviewerRoute.HomePage)" }, { "@type": "ListItem", "position": "2", "name": "тестовий текст", "item": "@Url.GetRouteUrl(EReviewerRoute.Platforms)" } ] } </script> }
方案2:序列化整个Breadcrumb对象(更安全可靠)
手动拼接JSON容易出错,尤其是处理特殊字符和编码时。建议构造对应的数据模型,通过JSON序列化工具自动生成规范的JSON内容,彻底避免编码问题。
- 定义JSON-LD对应的模型类:
public class BreadcrumbList { [JsonProperty("@context")] public string Context { get; set; } = "https://schema.org/"; [JsonProperty("@type")] public string Type { get; set; } = "BreadcrumbList"; public List<ListItem> ItemListElement { get; set; } = new List<ListItem>(); } public class ListItem { [JsonProperty("@type")] public string Type { get; set; } = "ListItem"; public string Position { get; set; } public string Name { get; set; } public string Item { get; set; } }
- 在ViewModel中初始化Breadcrumb对象:
public class ListPlatformsVM { public string str { get; set; } public BreadcrumbList Breadcrumb { get; set; } public ListPlatformsVM(IUrlHelper urlHelper) { Breadcrumb = new BreadcrumbList { ItemListElement = new List<ListItem> { new ListItem { Position = "1", Name = str, Item = urlHelper.GetRouteUrl(EReviewerRoute.HomePage) }, new ListItem { Position = "2", Name = "тестовий текст", Item = urlHelper.GetRouteUrl(EReviewerRoute.Platforms) } } }; } }
- 在Razor视图中序列化输出:
@model ListPlatformsVM @using Newtonsoft.Json @section Microdata { <script type="application/ld+json"> @Html.Raw(JsonConvert.SerializeObject(Model.Breadcrumb, Formatting.Indented)) </script> }
这种方式会自动处理字符编码、特殊字符转义,保证JSON结构的有效性,同时降低手动拼接的出错概率。
内容的提问来源于stack exchange,提问作者Kostenetskiy Stanislav
相关产品推荐
相关产品推荐

