ASP.NET WebForm中Sweetalert2弹窗读取资源文件值失效如何解决
问题根源
ASP.NET WebForm 中<%$ Resources:XXX %>是属性级绑定表达式,只能作为服务器控件属性的完整独立值使用,不支持嵌入在属性值的字符串拼接片段中。你把资源表达式写在OnClientClick属性的JS函数参数位置,属于属性值内部的拼接内容,ASP.NET解析器不会识别这类写法,只会把表达式当普通文本原样输出,额外加单引号也绕不开这个语法限制。
解决方案
方案1:后台动态赋值(最稳定,优先推荐)
直接在页面后台的Page_Load事件中读取资源值,拼接完整的JS逻辑赋值给按钮的OnClientClick属性,完全避开前端表达式解析限制:
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { // 读取全局资源值,如果是页面本地资源请用GetLocalResourceObject方法读取 string deleteTitle = Resources.resource.SweetAlert_Delete_Title.ToString(); string deleteText = Resources.resource.SweetAlert_Delete_Text.ToString(); // 给JS字符串参数加单引号,同时转义文本中可能存在的单引号避免语法错误 Btn_Delete.OnClientClick = $"return sweetAlertConfirm(this, '{deleteTitle.Replace("'", "\\'")}', '{deleteText.Replace("'", "\\'")}');"; } }
前端按钮代码移除内联的OnClientClick资源拼接即可:
<asp:Button ID="Btn_Delete" CssClass="btn btn-danger" runat="server" Text="Delete" OnClick="Btn_Delete_Click" />
方案2:前端脚本绑定(无需写后台代码)
不要把资源表达式写在服务器控件属性内部,给按钮设置固定ClientID后,通过独立的JS脚本绑定点击事件,用<%= %>直接输出强类型资源值:
<%-- 给按钮设置静态ClientID,方便前端JS获取 --%> <asp:Button ID="Btn_Delete" CssClass="btn btn-danger" runat="server" Text="Delete" OnClick="Btn_Delete_Click" ClientIDMode="Static" /> <script> document.getElementById('Btn_Delete').addEventListener('click', function(e){ e.preventDefault(); return sweetAlertConfirm( this, '<%= Resources.resource.SweetAlert_Delete_Title.ToString().Replace("'", "\\'") %>', '<%= Resources.resource.SweetAlert_Delete_Text.ToString().Replace("'", "\\'") %>' ); }) </script>
避坑说明
- 不要尝试在服务器控件的属性值内部嵌套
<%$ Resources %>表达式,该语法天生不支持内联拼接场景 - 所有传入JS的资源字符串必须做单引号转义,否则资源文本中出现英文单引号时会直接触发JS语法错误
- 请确保自定义的
sweetAlertConfirm逻辑正确:弹窗弹出时先返回false阻止按钮默认回发,用户点击确认后再手动触发回发,避免弹窗一闪而过直接执行后台删除逻辑 - 如果使用的是页面本地资源(存放在App_LocalResources文件夹下),后台读取请调用
GetLocalResourceObject("SweetAlert_Delete_Title")方法,前端<%= %>输出时调用GetLocalResourceObject即可。
内容的提问来源于stack exchange,提问作者NoBody Developer
相关产品推荐
相关产品推荐

