【问题标题】:Initializing JavaScript Variables on Server Side在服务器端初始化 JavaScript 变量
【发布时间】:2012-01-28 23:03:38
【问题描述】:

我在使用母版页在 ASP.Net Web 表单(非 MVC)中的服务器端设置 JavaScript 变量时遇到问题。

基本上我想做这样的事情:

<script type="text/javascript">
    var z = '<%# Request.QueryString["Env"] %>';
</script>

运行代码后,我看到:var z='';

我也试过了:

var z = '';

运行该代码后,我收到以下错误,因此我认为这是不正确的:

无法修改 Controls 集合,因为该控件包含代码块(即 )。

过去几年我主要从事 MVC 开发,所以我不确定自己做错了什么。

请告诉我。

谢谢

【问题讨论】:

  • 我离开 WebForms 也有一段时间了,但你的第二个 sn-p 看起来就像我记得的那样。你能多贴一些周围的代码吗?
  • 动态javascript是一种已知的反模式。不要做这种事。
  • @Raynos:我猜你没有做很多 MVC 开发,因为它被广泛使用。
  • @RichardCorkery 我知道反模式到处都在使用。那是因为大多数开发人员不知道他们在做什么。我对 ASP.NET 充满反模式并不感到惊讶

标签: javascript asp.net


【解决方案1】:

我认为在关闭 body 标签而不是 head 标签之前放置 javascript 是个好主意。然后你可以使用

【讨论】:

  • 感谢您的回复。我使用了这个选项并且它有效。谢谢。
【解决方案2】:

你提到的 javascript 块有没有可能在服务器控件中?

例如:

<head runat="server">
  <script type="text/javascript">
    var z = '<%# Request.QueryString["Env"] %>';
  </script>
<head>

如果是这样,请尝试将其更改为:

 <head runat="server">
    <div runat="server">
      <script type="text/javascript">
        var z = '<%= Request.QueryString["Env"] %>';
      </script>
    </div>
 <head>

参考:http://www.west-wind.com/weblog/posts/2006/May/27/The-Controls-collection-cannot-be-modified-because-the-control-contains-code-blocks-ie-

【讨论】:

    【解决方案3】:

    肯定&lt;%# %&gt; 是用于迭代,要呈现一个字符串,您需要使用&lt;%= %&gt;,因为可能在服务器上运行的标头上最好避免这种情况并使用这样的文字。

    <script type="text/javascript">
        <asp:literal run="server" id="txtJavaDeclarations" EnableViewState="false" />
    </script>
    

    关于后面的代码

    txtJavaDeclarations.Text 
          = string.Format("var z = '{0}' ;\n", Request.QueryString["Env"]);
    

    【讨论】:

      【解决方案4】:

      我很想使用

      ClientScript.RegisterClientScriptBlock(GetType(), "scriptBlockKey", 
              "var z = '" + Request.QueryString["Env"] + "';", true);
      

      这应该写在你需要的带有脚本标签的脚本块中(最终参数设置为true)。

      它是从服务器端调用的,所以只需将它放入Page_Load。它的好处是在出现问题时更容易调试。

      我很想对查询字符串进行空值检查,也可以使用三元运算符,即

        string env = Request.QueryString["Env"] == null ? string.Empty : 
                                          Request.QueryString["Env"].ToString();
          ClientScript.RegisterClientScriptBlock(GetType(), "scriptBlockKey", 
                  "var z = '" + env + "';", true);
      

      只是让空检查更透明一点,也许可以为默认情况提供机会。

      【讨论】:

      • 感谢您的回复。我使用了这个选项并且它有效。但是,我决定使用不同的答案来解决我的问题,因为它的变化少了一点。再次感谢。
      猜你喜欢
      • 2023-03-18
      • 1970-01-01
      • 2016-05-08
      • 2011-07-08
      • 1970-01-01
      • 2020-09-25
      • 2012-01-16
      • 2013-04-05
      • 1970-01-01
      相关资源
      最近更新 更多