如何安全地将 C# 列表通过 onclick 传递给 jQuery 方法

发布时间 - 2026-02-01 00:00:00    点击率:

本文讲解如何在 asp.net razor 页面中,将 c# 对象(如 list)序列化为 json 并安全注入 html 的 onclick 属性,避免因特殊字符(如 `/`、`*`、`-`、引号或反斜杠)导致 javascript 解析失败。

在 ASP.NET MVC 或 Razor Pages 中,常需将服务端数据(例如 List 或复杂模型)直接传入前端 JavaScript 函数。看似简单的一行代码:

实际运行时却容易报错——浏览器控制台可能提示 Uncaught SyntaxError: Unexpected token 或 JSON.parse: unexpected character。根本原因在于:@Json.Serialize() 生成的是纯 JSON 字符串(如 ["*abc/def-"]),但将其直接嵌入 HTML 属性值(尤其是双引号包裹的 onclick="...")中时,未对 JSON 内部的引号、反斜杠、换行等进行 HTML/JavaScript 上下文转义,导致 HTML 解析器或 JS 引擎提前截断或解析失败。

✅ 正确做法是:双重编码——先用 Json.Serialize() 转为 JSON 字符串,再用 HttpUtility.JavaScriptStringEncode() 对其进行 JavaScript 字符串安全转义,确保可安全嵌入 HTML 属性中。

✅ 推荐写法(Razor + C#)

⚠️ 注意:

  • 必须使用 单引号 包裹 onclick 属性值(如 onclick='...'),否则双引号嵌套易冲突;
  • 使用 @Html.Raw(...) 防止 Razor 自动 HTML 编码转义后的字符串(否则 " 等会破坏 JSON);
  • HttpUtility.JavaScriptStringEncode() 会将 " → \"、\ → \\、换行 → \n 等,确保字符串在 JS 上下文中合法。

✅ 对应的 JavaScript 方法(无需 JSON.parse)

由于传入的已是合法 JavaScript 字面量(非 JSON 字符串),直接使用即可,无需 JSON.parse()

function nextSlide(question) {
    // question 已是解析后的 JS 对象(如数组或对象),可直接使用
    console.log(question); // e.g., ["*abc/def-"]
    console.log(Array.isArray(question)); // true
}

❌ 错误写法(会导致解析失败):


onclick="nextSlide(@Json.Serialize(@question))"


function nextSlide(question) {
    var myList = JSON.parse(question); // ❌ TypeError: Cannot parse object as JSON
}

? 补充说明

  • 若 @qu

    estion 是 List,序列化后为 ["a","b/c","*def-"];经 JavaScriptStringEncode 后变为 "["a","b\/c","\*def-"]"(内部引号与斜杠已转义),最终被 JS 正确识别为数组字面量。
  • 在 .NET 6+ 中,推荐使用 System.Text.Json.JsonSerializer.Serialize() 配合 Microsoft.AspNetCore.Mvc.Rendering.HtmlHelper 扩展方法,但 HttpUtility.JavaScriptStringEncode 仍是兼容性最佳的选择。
  • 更现代的替代方案(推荐长期采用):将数据预埋在 data-* 属性或

总之,安全传递服务端数据的关键在于:序列化 + 上下文转义 + 正确引用方式。一次配置,彻底规避因特殊字符引发的静默失败。


# javascript  # java  # jquery  # html  # js  # 前端  # json  # 编码  # 浏览器  # app  # microsoft  # mvc  # String  # Token  # 字符串 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Swift中swift中的switch 语句  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  如何彻底卸载建站之星软件?  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  重庆市网站制作公司,重庆招聘网站哪个好?  开心动漫网站制作软件下载,十分开心动画为何停播?  Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  微信小程序 配置文件详细介绍  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  个人摄影网站制作流程,摄影爱好者都去什么网站?  如何在服务器上配置二级域名建站?  怎么用AI帮你为初创公司进行市场定位分析?  微信小程序 五星评分(包括半颗星评分)实例代码  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  Laravel如何使用Service Container和依赖注入?(代码示例)  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  Laravel如何使用.env文件管理环境变量?(最佳实践)  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  ,网页ppt怎么弄成自己的ppt?  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  轻松掌握MySQL函数中的last_insert_id()  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  nginx修改上传文件大小限制的方法  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  Laravel怎么判断请求类型_Laravel Request isMethod用法  Laravel如何使用withoutEvents方法临时禁用模型事件  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件  Laravel Session怎么存储_Laravel Session驱动配置详解  Laravel如何配置Horizon来管理队列?(安装和使用)  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  网站制作免费,什么网站能看正片电影?  Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  微信小程序 scroll-view组件实现列表页实例代码  佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  Laravel如何创建自定义Facades?(详细步骤)  Laravel如何构建RESTful API_Laravel标准化API接口开发指南  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  如何确保西部建站助手FTP传输的安全性?  实例解析Array和String方法  Laravel如何实现一对一模型关联?(Eloquent示例)  Laravel如何与Pusher实现实时通信?(WebSocket示例)  Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南