ASP.NET的aspx页面中开头带0的字符串在jQuery确认框中异常转换问题
异常触发原因
你遇到的两类异常本质都是服务端渲染的Reference字段值没有被包裹为JavaScript字符串字面量,直接被当做JS代码片段解析执行导致的:
- 当Reference为带前导0的全数字内容时,JS会默认将前导0开头的数字识别为八进制数值:
0003转十进制为3,03030转十进制恰好为1560,和你遇到的转换结果完全匹配。 - 当Reference包含字母时,渲染后的JS代码会把这段内容识别为变量名,查找不到对应变量就会抛出未定义异常,直接打断后续代码执行,导致确认弹窗无法弹出。
你在<h1>标签中渲染正常是因为HTML中直接输出字符串内容不需要符合JS语法规则,两类场景的渲染上下文完全不同。
可行解决方案
提供两种落地成本低且兼容性好的方案:
方案1:服务端渲染时转义为合法JS字符串
在输出Reference的位置增加引号包裹,同时用ASP.NET内置的HttpUtility.JavaScriptStringEncode方法处理JS特殊字符转义,避免内容中包含引号、换行等字符打断字符串结构:
$('#btDelete').click(function(e) { e.preventDefault(); $.confirm({ 'title': 'Delete', // 核心改动:增加单引号包裹+JS字符串转义 'message': "You will delete the object <i>" + '<%: HttpUtility.JavaScriptStringEncode(Model.Reference) %>' + "</i>. Do you want to continue?", 'buttons': { 'Si': { 'class': 'blue', 'action': function() { //some code to make the delete } }, 'No': { 'class': 'gray', 'action': function() {} } } }); });
方案2:通过DOM属性传递值(更推荐)
避免直接在JS代码中拼接服务端渲染内容,将值存在按钮的自定义data属性中,JS侧直接读取DOM属性值:
首先修改删除按钮的aspx代码,增加data属性:
<button id="btDelete" data-reference="<%: Model.Reference %>">删除</button>
再修改JS逻辑读取属性:
$('#btDelete').click(function(e) { e.preventDefault(); // 直接读取DOM属性值,自动处理编码问题 const reference = $(this).data('reference'); $.confirm({ 'title': 'Delete', 'message': "You will delete the object <i>" + reference + "</i>. Do you want to continue?", 'buttons': { 'Si': { 'class': 'blue', 'action': function() { //some code to make the delete } }, 'No': { 'class': 'gray', 'action': function() {} } } }); });
该方案完全规避了服务端拼接JS代码的语法风险,后续维护也更灵活。
内容的提问来源于stack exchange,提问作者Keras-JOB
相关产品推荐
相关产品推荐

