我知道这有一个简单的答案,但这有两个问题。
问题1:
在asp.net页面中有一个像这样的javascript块:
<script type="text/javascript">
function doSomethingRandom() {
var myVarToUse = <asp:Literal runat="server" ID="HackyLiteral" />
}
</script>
好的,所以这是问题的简化版本,但应该很清楚。我现在想把这个函数移到一个JS文件中...但我不能把asp:Literal放到JS中。
var myVarToUse = <asp:Literal runat="server" ID="HackyLiteral" />
<script src="myJSFile.js" />
...让我有点不舒服,有更好的方法吗?
问题2:
类似的问题,但这次第二个版本看起来像这样:
<asp:ScriptManagerProxy runat="server">
<Scripts>
<asp:ScriptReference Path="~/tree/AttributeTree.js" />
</Scripts>
</asp:ScriptManagerProxy>
但这次我无法现实地把
var myVarToUse = <asp:Literal runat="server" ID="HackyLiteral" />
在它之上,因为有了ScriptManagerProxy,没有真正的方法可以确切地知道脚本文件的出现位置。
所以,他们就是问题所在!感谢。
答案 0 :(得分:3)
我们使用Page
的{{3}}方法向ClientScriptManager注册初始化函数。我们的Javascript文件只包含函数,并通过ScriptManager
加载(就像在您的代码段中一样)。我们为Page编写了一个扩展方法(称为JSStartupScript
),它有助于注册启动脚本,并且在一天结束时我们的代码如下所示:
<%
Page.JSStartupScript(string.Format("initFeatureX({0}, {1}, {2});",
AntiXss.JavaScriptEncode(ViewData.Property1),
AntiXss.JavaScriptEncode(ViewData.Property2),
AntiXss.JavaScriptEncode(ViewData.Property3)));
%>
这与ScriptManager
s CompositeScript
集合和LoadScriptsBeforeUI = false
设置结合使用效果很好。
答案 1 :(得分:1)
基本上:你做不到。
你可以做的是在ASP生成的网站上设置值(就像你现在一样),然后从外部js脚本中引用该变量,但这很难看。
另一个解决方案是你可以将这个变量存储在一个cookie中(由ASP设置),然后在外部JS中读取该cookie。您也可以将此值传递给您正在显示的网站的URL并解析JS中的网址以获取值,但我认为Cookie会更好,因为您仍然会有一个干净的URL并且读取cookie比解析网址更容易PARAMS。
答案 2 :(得分:0)
您可以将aspx文件用作js文件。
\<script src="<%= ResolveUrl("~/js/dynamic.aspx") %>"></script>
你可以在aspx中做任何你想做的事。
答案 3 :(得分:0)
另一种方法是动态加载javascript文件。 我的意思是这样的
<script>
var myVarToUse = <asp:Literal runat="server" ID="HackyLiteral" />
ComponentLoad("/tree/AttributeTree.js"); //here Javascript file will be loaded
</script>
但即使这不是最好的解决方案。因为会有很多全局变量。 最好这样做:
<script>
ComponentLoad("/tree/AttributeTree.js","doSomethingRandom",{myVarToUse:"<asp:Literal runat="server" ID="HackyLiteral" />"}); //here Javascript file will be loaded
</script>