2009-08-11 29 views
4

我知道这有一个简单的答案,但这是以2个问题的形式出现的。如何将变量传递给JS文件

问题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,没有真正知道脚本文件将出现在哪里的真正方法。

所以,他们的问题!谢谢。

回答

3

我们使用PageRegisterStartupScript方法向ClientScriptManager注册初始化函数。我们的Javascript文件只包含功能,并通过ScriptManager加载(如在你的代码片段中)。我们写了一个扩展方法的第(称为JSStartupScript)与注册启动脚本帮助,并在这一天我们的代码如下所示的末尾:

<% 
    Page.JSStartupScript(string.Format("initFeatureX({0}, {1}, {2});", 
     AntiXss.JavaScriptEncode(ViewData.Property1), 
     AntiXss.JavaScriptEncode(ViewData.Property2), 
     AntiXss.JavaScriptEncode(ViewData.Property3))); 
%> 

这也结合了ScriptManager作品大CompositeScript集合和LoadScriptsBeforeUI = false设置。

+0

+1,正如我在最近的一个项目 – 2009-08-11 09:16:24

1

基本上:你不能那样做。

你可以做的是设置由ASP(如你现在)生成的网站上的值,然后从外部js脚本引用该变量,但这很丑。

另一种解决方案是,您可以将此变量存储在一个cookie(将由ASP设置)中,然后在外部JS中读取该cookie。您也可以将此值传递给您正在显示的网站的URL,并在JS中解析URL以获取值,但我认为Cookie会更好,因为您仍然拥有干净的URL,并且读取Cookie更容易,然后解析url PARAMS。

+0

+1的Cookie。好主意。 – 2012-05-17 15:48:43

0

您可以使用aspx文件作为js文件。

\<script src="<%= ResolveUrl("~/js/dynamic.aspx") %>"></script>

的,你可以做任何你在ASPX希望。

+0

上所做的那样(删除斜杠 - stackoverflow本来想剥去脚本标记) – 2009-08-11 09:16:38

+1

您将对该解决方案存在缓存问题,我很害怕。如果您不在链接中保留动态参数,您的浏览器可能会缓存它,并且不会下载因ID已更改而可能已更改的更新版本。如果您添加动态参数,则浏览器将在每次刷新页面时下载此文件。 – RaYell 2009-08-11 09:25:38

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>