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

ASP.NET View中使用Html.Raw传递对象至onclick事件的引号问题及最优实现方式咨询

ASP.NET View中使用Html.Raw传递对象至onclick事件的引号问题及最优实现方式咨询

嗨,我来帮你拆解这个问题的原因和解决方案哈!

为什么双引号会出问题?

核心原因是引号嵌套冲突:
当你用双引号包裹onclick属性值时,@Html.Raw(Json.Encode(model))生成的JSON字符串里必然包含双引号(比如对象的属性名、字符串类型的属性值)。举个例子,假设你的model是{Name: "Alex"},JSON编码后会是{"Name":"Alex"},最终生成的HTML会变成:

<a href="#" onclick="my_cool_function({"Name":"Alex"})">cool action</a>

你看,JSON里的第一个"会直接闭合onclick的起始双引号,剩下的Name":"Alex"})>就变成了无效的HTML内容,浏览器自然无法正确解析这个属性。

而改用单引号包裹onclick属性后,JSON里的双引号就不会和外层的属性引号冲突了,生成的HTML是这样的:

<a href="#" onclick='my_cool_function({"Name":"Alex"})'>cool action</a>

浏览器能正确识别onclick的完整值,所以问题就消失了。至于之前能正常工作,大概率是浏览器的容错机制在起作用,现在浏览器的HTML解析规则更严格了,就暴露了这个问题。

更优雅的实现方式(推荐)

其实内联onclick并不是现代前端的最佳实践,推荐把数据和事件逻辑分离,用data-*属性来存储对象数据,再通过JS绑定事件:

  1. 首先在HTML里把model数据存在元素的自定义属性中:
<a href="#" class="cool-action-link" data-model='@Html.Raw(Json.Encode(model))'>cool action</a>
  1. 然后在单独的JS脚本中绑定点击事件:
// 等待DOM加载完成
document.addEventListener('DOMContentLoaded', function() {
  // 找到目标元素
  const actionLink = document.querySelector('.cool-action-link');
  // 绑定点击事件
  actionLink.addEventListener('click', function(e) {
    // 阻止a标签的默认跳转行为
    e.preventDefault();
    // 解析data属性里的JSON数据
    const model = JSON.parse(this.dataset.model);
    // 调用你的函数
    my_cool_function(model);
  });
});

这种方式不仅彻底避免了引号冲突的问题,还实现了HTML结构和JS逻辑的分离,代码更易维护和调试。

如果一定要用内联方式的话,保持用单引号包裹onclick属性就是最直接的解决办法啦。

备注:内容来源于stack exchange,提问作者alex_kart

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 09:37:57