如何将变量传递到JS文件中

4
我知道这个问题有一个简单的答案,但它包含两个问题。
问题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个回答

3
我们使用 PageRegisterStartupScript 方法来向 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)));
%>

这也可以与ScriptManagerCompositeScript集合和LoadScriptsBeforeUI = false设置很好地结合使用。


1

基本上:你不能这样做。

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

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


0
你可以将aspx文件用作js文件。 \<script src="<%= ResolveUrl("~/js/dynamic.aspx") %>"></script> 然后你可以在aspx文件中做任何你想做的事情。

(删除斜杠- stackoverflow希望剥离脚本标记,否则)def factorial(n): if n == 0: return 1 else: return n * factorial(n-1)这是一个计算阶乘的Python函数。 - kͩeͣmͮpͥ ͩ
1
恐怕你的解决方案会遇到缓存问题。如果在链接中不保留动态参数,浏览器很可能会将其缓存,并不会下载已更改的更新版本,因为id已经变了。而如果添加动态参数,浏览器将在每次页面刷新时下载该文件。 - RaYell

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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接