【问题标题】:<%=values%> are not updating inside an update panel<%=values%> 不在更新面板内更新
【发布时间】:2017-03-12 10:54:13
【问题描述】:

我已经尝试了几乎所有建议的解决方案,这些解决方案与我的问题有关,但没有运气。我正在创建一些图表(使用Dygraphs 库)。下面的 javascript 代码只是整个函数的一小部分;事实上,我以这种方式创建了 5 个图表。

<script>

    designRawGraphs();

    function designRawGraphs()
    {

                var g1 = new Dygraph(
                document.getElementById("graphdiv"),
                [ <%=sDataForROI1Graph%> ],
            { 
                labels: <%=sLabelsForROI1Graph%>,
                connectSeparatedPoints: true,
                animatedZooms: true,
                highlightCircleSize: 3,
                highlightSeriesOpts: {
                    highlightCircleSize: 6
                },
                drawPoints: true,
                title: 'ROI 1 - Region of Interest',
                ylabel: 'Raw Fluorence Intensity',
                xlabel: 'Time (seconds)' 
            }
                        );

    }
</script>

在后面的代码中,我序列化(并作为String)两个 sDataForROI1GraphsLabelsForROI1Graph 全局变量,它们用数据库的结果填充以特定格式查询(Dygraphs 的预期格式)。此 javascript 代码位于 asp:UpdatePanel 内。当我触发一个按钮(也在同一个 UpdatePanel 内)时,查询返回不同的结果,因此 sDataForROI1GraphsLabelsForROI1Graph 都发生了变化,但图表没有重新设计(即全局变量的值没有使用 技术从后面的代码传递到客户端)。我还向触发按钮声明了Trigger 选项,如下所示...

   <Triggers>
        <asp:AsyncPostBackTrigger ControlID="RemoveAllbtn" />
   </Triggers>

... 我的代码很简单,如下面的 sn-p 所示(实际上我重新运行了一个存储过程,它更新了 2 个全局变量 sDataForROI1GraphsLabelsForROI1Graph em> 具有新值)

Protected Sub RemoveAllbtn_Click(ByVal sender As Object, ByVal e As EventArgs) Handles RemoveAllbtn.Click
    RemoveAll()
End Sub

如果我删除 UpdatePanel,一切都会像魅力一样发挥作用,因为会发生完整的回发。我试图注入 javascript 代码并执行其他棘手的建议,但我还没有找到解决方法。

我的问题是为什么这 2 个全局变量在嵌套到 UpdatePanel 时不能从客户端访问?绕过这个问题的最佳方法是什么?我还阅读了有关隐藏文本框/隐藏字段/标签/文字控件的信息,但即使这些方法也无法帮助我解决问题。

编辑

诚然,以下建议的答案是我所需要的,而且效果很好,但是在我花了很多时间解决我的问题并将我的头撞到墙上之后,我意识到我的问题仍然存在并且原因太奇怪了。在客户端,在 UpdatePanel 之外,我创建了一个 &lt;asp:HiddenField ID="hidfieldforROI1" runat="server"/&gt; ,我试图像这样获得它的价值

var dataforROI1 = document.getElementById('<%= hidfieldforROI1.ClientID %>').value; 

在后端,我将 Value 设置为 hidfieldforROI1 控件。我收到以下奇怪的错误:

error BC30451: 'dataforROI1' is not declared. It may be inaccessible due to its protection level.

如果有任何建议,我将不胜感激。

【问题讨论】:

  • Literal控件替换它? [ &lt;asp:Literal ID="sDataForROI1Graph" runat="server"&gt;&lt;/asp:Literal&gt; ],
  • @VDWWD 你能告诉我如何使用javascript在客户端获取文字文本吗?
  • 你不能。您在后面的代码中设置文字的值。 sDataForROI1Graph.Text = "yourJavaScriptStringValue"; 如果您使用&lt;%= yourJavaScriptStringValue %&gt;,它会在客户端提供完全相同的结果@
  • 我想要做的是将文本从后面的代码传递到客户端,而不是相反。实际上,您的建议与 &lt;%=stringvalue%&gt; 方法给出了相同的结果。但我的问题是创建图形的javascript 代码为&lt;%=sDataForROI1Graph%&gt;&lt;%=sLabelsForROI1Graph%&gt; 获取了2 个初始值,即使它们在后面的代码中发生变化,它们在客户端也不会改变。
  • 啊,我明白了。忽略我以前的cmets。您可能需要再次调用designRawGraphs() 来重建图形。将他的代码放在ScriptManager.RegisterStartupScript(Page, Page.GetType, "designRawGraphs", "designRawGraphs();", true) 后面

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


【解决方案1】:

在 aspx 文件中

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>

        <div id="testdiv"><%= sDataForROI1Graph %></div>
        <br />
        <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click"></asp:Button>
        <br />
        <script type="text/javascript">
            function testScript() {
                alert(document.getElementById("testdiv").innerHTML);
                var dataforROI1 = document.getElementById('<%= hidfieldforROI1.ClientID %>').value;
                alert(dataforROI1);
            }
        </script>

    </ContentTemplate>
</asp:UpdatePanel>

<asp:TextBox ID="hidfieldforROI1" runat="server" Text="textBoxje"></asp:TextBox>

然后在后面的代码中

Dim sDataForROI1Graph As String = DateTime.Now.ToString

Sub Page_Load(ByVal Sender As System.Object, ByVal e As System.EventArgs)
    hidfieldforROI1.Text = "Page Load"
End Sub

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs)
    sDataForROI1Graph = DateTime.Now.ToString

    ScriptManager.RegisterStartupScript(Page, Page.GetType, "testScript", "testScript();", true)
End Sub

如果我使用此代码,sDataForROI1Graph 在单击按钮后会更新并与警报一起显示。

更新

我稍微改变了我的答案以包含一个 HiddenField(我的 sn-p 中的 TextBox 以使可视化更容易)。 HiddenField 在Page_load' and inButton1_Click. The one inButton1_Clickwill ofcourse not show up since theHiddenFieldis outside theUpdatePanel. But the properties are still available so you can still usehidfieldforROI1.ClientIDinside theUpdatePanel 中获取值`

【讨论】:

  • 我编辑了我的帖子,因为我意识到问题仍然存在,原因与我的第一个解释略有不同。
  • 我已经更新了我的答案,在UpdatePanel 之外添加了一个HiddenField。但是您的错误消息与更新面板无关。 dataforROI1 不存在(缺少s?> sDataForROI1Graph)或者它在没有public 的地方声明? (Public dataforROI1 As String = "myString")
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多