如何将变量传递给JS文件

时间:2009-08-11 09:08:38

标签: asp.net javascript asp.net-ajax

我知道这有一个简单的答案,但这有两个问题。

问题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,没有真正的方法可以确切地知道脚本文件的出现位置。

所以,他们就是问题所在!感谢。

4 个答案:

答案 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>