【问题标题】:How to pass variables in to a JS file如何将变量传递给JS文件
【发布时间】:2010-11-18 13:19:29
【问题描述】:

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

问题一:

在 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 无法真正知道脚本文件将出现在哪里。

所以,问题出在他们身上!谢谢。

【问题讨论】:

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


    【解决方案1】:

    我们使用PageRegisterStartupScript 方法向ClientScriptManager 注册初始化函数。我们的 Javascript 文件仅包含函数,并通过 ScriptManager 加载(就像在您的 sn-p 中一样)。我们为页面编写了一个扩展方法(称为JSStartupScript),它有助于注册启动脚本,最终我们的代码如下所示:

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

    这也可以与ScriptManagers CompositeScript 集合和LoadScriptsBeforeUI = false 设置结合使用。

    【讨论】:

      【解决方案2】:

      基本上:你不能那样做。

      您可以做的是在网站上设置由 ASP 生成的值(就像您现在一样),然后从外部 js 脚本中引用该变量,但这很难看。

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

      【讨论】:

        【解决方案3】:

        您可以将 aspx 文件用作 js 文件。

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

        你可以在 aspx 中做任何你想做的事情。

        【讨论】:

        • (删除斜线 - stackoverflow 想要去掉脚本标签)
        • 恐怕您在使用该解决方案时会遇到缓存问题。如果您不在链接中保留动态参数,您的浏览器可能会缓存它并且不会下载可能因为 id 已更改而更改的更新版本。如果您添加动态参数,浏览器将在每次页面刷新时下载此文件。
        【解决方案4】:

        另一种方法是动态加载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>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多