You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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内容,彻底避免编码问题。

  1. 定义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; }
}
  1. 在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)
                }
            }
        };
    }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 22:53:10