正如poncha 所指出的,问题在于就 ASP.NET 而言,您的 .js 文件中传递的内容是一个字符串。在 IIS 交付之前,它不会应用任何类型的呈现。它得到与任何其他内容文件相同的处理,例如 a.jpg
或.png
.
为了调用服务器端方法(如ResolveUrl
),您需要<% ... %>
在任何由 ASP.NET解析.aspx
的页面(如或.master
文件)中使用语法。
顺便说一句,这些小代码块有很多不同的名称:
特别是,我们想要一个具有语法的显示表达式<%= ... %>
,其中:
等号后输入的值写入当前页
知道了这一点,我们可以使用以下方法构建自己的 URL ResolveClientUrl()
:
返回适合客户端访问 Web 服务器上资源的 URL 字符串
为此,我们将传入Web 应用程序根运算符或~
字符,其中 ASP.NET:
将 ~ 运算符解析为当前应用程序的根:
通过结合这些,我们可以将显示表达式的结果保存到 JavaScript 变量中,方法是在您的母版页上放置以下代码(改编自Joel Varty 的博客):
<script type="text/javascript">
var baseUrl = '<%= Page.ResolveClientUrl("~/") %>';
</script>
由于 JavaScript 变量本质上是全局的,因此任何其他脚本现在都可以访问该baseUrl
变量,因此我们可以通过以下脚本从 .js 文件中使用它:
function ResolveUrl(url) {
return url.replace("~/", baseUrl);
}
现在您可以ResolveUrl("~/DynamicMenu.ashx")
直接从您的 javascript 文件中调用,它会通过删除“~/”并将其替换为服务器端脚本之前创建的 baseUrl 来创建适当的 URL。
延伸阅读: