在 HTML > JavaScript > WebForms 中嵌套引号或如何在 JavaScript 方法中调用 .NET 方法

Nesting quotes in HTML > JavaScript > WebForms or how to call a .NET method in a JavaScript method

谁会这么想,但是 我实际上需要在 ASP.NET WebForms 页面中使用 3 层嵌套引号。

这是我拥有的:

<img 
    src='<% ResolveClientUrl("~/SwissStyleguide/img/swiss.svg"); %>'
    onerror="this.onerror=null; this.src='SwissStyleguide/img/swiss.png';" 
    alt="Confederatio Helvetica" 
/>

现在,第一部分,将动态创建的 URL 分配给 src 属性可以正常工作。服务器解析给定的特殊 URL 并创建一个绝对 link 供客户端获取。

但是 onerror 处理程序更棘手:因为 png 图像的 src URL 已经在带双引号的表达式中,我无法调用 ASP.NET ResolveClientUrl 方法,严格要求字符串参数使用双引号。

我试过这样做(不起作用!)

<img 
    src='<% ResolveClientUrl("~/SwissStyleguide/img/swiss.svg"); %>'
    onerror="this.onerror=null; this.src='<% ResolveClientUrl("~/SwissStyleguide/img/swiss.png"); %>';" 
    alt="Confederatio Helvetica" 
/>

但不足为奇的是,Visual Studio 抱怨这个字符串。我想到的唯一想法是使用字符串常量来避免最里面的引号,但这看起来很丑陋。

是否有办法转义或以其他方式指定部分或全部引号以使其有效?

注意:我知道这个问题:When to use double or single quotes in JavaScript? 但在这种情况下更改引号没有帮助。

好吧,...结果是 "<%$, <%@, <%=, <%# ...... 怎么回事?" WebForms 问题,在这里得到了完美的回答:

解决办法是在百分号后使用等号,省略尾随分号。像这样:

onerror="this.onerror=null; this.src='<%= ResolveClientUrl("~/SwissStyleguide/img/swiss.png") %>';" 

我会把问题和这个答案留在这里,以提醒任何人也被这个绊倒。

如何改为放置代码隐藏的属性?

.aspx

<img id="image" runat="server" alt="Confederatio Helvetica" /> 

.aspx.cs (Page_Load)

image.Attributes.Add("src", Page.ResolveUrl("~/SwissStyleguide/img/swiss.svg"));
image.Attributes.Add("onerror", "this.onerror=null; this.src='" +
    Page.ResolveUrl("~/SwissStyleguide/img/swiss.png") + "';";