ASP.NET - 为什么服务器端脚本分隔符与标记中的文本内容组合显示时行为不同
本文关键字:组合 文本 显示 服务器端 为什么 NET 脚本 分隔符 ASP | 更新日期: 2023-09-27 17:56:55
我试图理解为什么 ASP.NET 脚本分隔符<%
和%>
有时会被转义并呈现而不是替换,具体取决于它们的位置和周围的标记,例如:
这按预期工作,返回代码隐藏BASE_URL
变量或属性的内容作为页面标题:
<title><%= BASE_URL %></title>
虽然这被转义并逐字呈现到页面中:
<link href="<%= BASE_URL %>_/css/screen.css" rel="stylesheet">
这些再次按预期工作,替换BASE_URL
的值:
<link href="<%= "" + BASE_URL %>_/css/screen2.css" rel="stylesheet">
<link href="<%= "//localhost:12345/" %>_/css/screen3.css" rel="stylesheet">
这种细微的差异在关于此主题的 wiki 文章中没有涉及:https://stackoverflow.com/a/649458/1132334
好吧,这将是纯粹的猜测,但我想无论如何我都会分享它。手头没有 VS 可以验证,所以希望您在发布之前测试得足够好!
首先,让我们忽略您的第一个示例,因为它有点不同且简单 - 它只是按预期工作。对于其余的示例,这些示例都是关于在双引号标记中声明的代码呈现块,模式似乎是:
- 如果代码呈现块内有引号,则识别该块
- 如果没有引号,则无法识别块
所以我关于解析器如何在这里工作的理论是这样的。当解析器遇到引号内的标记时,它会对其进行分析。
-
如果同时存在开仓
<
和闭>
符号,则它会根据 XML 规则将它们转义为<
和>
,并且不会继续 toke 分析。 -
如果只找到开始符号,它会将其识别为呈现块开始的代码,并在随后的标记中搜索结束部分。如果找到关闭部分,则您有一个完整的块,这只是一个
Response.Write()
执行。如果未按预期找到 clostig 标记,则会出现语法错误。 -
如果只找到结束符号,并且之前没有检测到开始符号,则也是语法错误。
这似乎与您所看到的相符。让我们通过示例运行。
<link href="<%= BASE_URL %>_/css/screen.css" rel="stylesheet">
"<%= BASE_URL %>_/css/screen.css"
是单个令牌,包含两个<>
,因此转换为"<%= BASE_URL %>_/css/screen.css"
<link href="<%= "" + BASE_URL %>_/css/screen2.css" rel="stylesheet">
"<%= "
是一个带有<
的令牌," + BASE_URL %>_/css/screen2.css"
是另一个带有>
的令牌。因此,这被识别为代码渲染块并被视为"<%= Response.Write("" + BASE_URL) %>_/css/screen2.css"
。与上一个示例相同。
同样,这只是一个猜测,似乎与观察到的行为相匹配。如果这被证明是错误的,或者有更好的答案,我很乐意删除。