【问题标题】:Avoid Execution of Embedded Code Blocks in ASP.NET避免在 ASP.NET 中执行嵌入式代码块
【发布时间】:2017-07-29 03:26:25
【问题描述】:

在 WebForms 项目中,在特定页面上,我在 aspx 文件中有一个 javascript 方法。在里面我使用了 2 个嵌入式代码块。

<script type="text/javascript">
    function showMessage(idActityGroup) {
        var r = confirm("Message");
        if (r == true) {
            //First Code Block
            <%string idActityGroup = "' + idActityGroup + '";
            //Second Code Block
            '<%Session["waitList"] = "yes"; %>';
            //Last javascript instruction
            window.location.href = '/Register';
        }
</script>

问题是每次触发按钮的点击事件时都会执行这两行。当代码隐藏按钮完成它的工作时,它会进入 aspx 并执行这两行。我只希望它们在调用函数时运行。该方法位于 updatePanel 中。我试图从 updatePanel 中获取 javascript 函数,但同样的事情仍在发生。

有没有办法避免这种行为?非常感谢。

【问题讨论】:

  • 明确一点,你不想执行的就是这一行——'&lt;%Session["waitList"] = "yes"; %&gt;';?
  • 另外,您的 JS 无效,因为您的 {} 多。
  • 我知道 mjwills,但是我添加了 } 是的,是那一行和上一行。谢谢。

标签: javascript c# asp.net


【解决方案1】:

在解决您的问题之前,您应该清楚地了解发生了什么以及为什么每次按下按钮时都会执行这两行。您应该首先查看this 文档关于 ASP.net 中的页面生命周期

在预渲染阶段之后,内联代码(您所说的 2 行)被执行,然后生成 HTML。

当您单击一个按钮时,它会提交一个回发并且 ASP.net 重新呈现该页面,因此您的 2 行将被第二次执行。

现在,我认为您无法通过这种方式实现您想要的。 IE。你的第二个代码块:

<%Session["waitList"] = "yes"; %>

将在每次页面加载时为会话状态中的“waitList”键分配“是”。 你应该尝试generate a postback 来处理后面的代码。

<script type="text/javascript">
    function showMessage(idActityGroup) {
        var r = confirm("Message");
        if (r == true) {
            //First Code Block
            __doPostBack('handleMessageConfirmed',null)
        }
</script>

【讨论】:

  • 非常感谢。正如您所提到的,无法阻止嵌入式代码块执行,因为每次调用服务器时都会预先呈现视图。 __doPostBack 函数帮助我解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 2017-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-13
  • 2014-05-15
  • 1970-01-01
  • 2013-11-07
相关资源
最近更新 更多