我已经尝试了几乎所有建议的解决方案,这些解决方案都发布在这里并且与我的问题无关,没有运气。我正在创建一些图表(使用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
) sDataForROI1Graph 和 sLabelsForROI1Graph 全局变量,这些变量都填入了结果特定格式的数据库查询(Dygraphs的预期格式)。此javascript代码位于asp:UpdatePanel
内。当我触发一个按钮(也在同一个UpdatePanel内)时,查询会返回不同的结果,因此 sDataForROI1Graph 和 sLabelsForROI1Graph 都会被更改,但图形不会重新设计(也就是说,全局变量的值没有通过&lt;%= =&gt;技术从代码传递到客户端。我还向被触发的按钮声明了Trigger
选项,如下所示......
<Triggers>
<asp:AsyncPostBackTrigger ControlID="RemoveAllbtn" />
</Triggers>
...我的代码很简单,如下面的代码片段所示(实际上我重新运行了一个存储过程,它更新了2个全局变量 sDataForROI1Graph 和 sLabelsForROI1Graph 用新值)
Protected Sub RemoveAllbtn_Click(ByVal sender As Object, ByVal e As EventArgs) Handles RemoveAllbtn.Click
RemoveAll()
End Sub
如果删除UpdatePanel,一切都像魅力一样,因为会发生完整的回发。我试图注入javascript代码并执行其他棘手的建议,但我还没有找到解决方法。
我的问题是为什么在嵌套到UpdatePanel时无法从客户端访问这两个全局变量?绕过此问题的最佳方法是哪种?我还阅读了隐藏的Textboxes / HiddenFields / Labels / Literals控件,但即便是这些方法也无法解决我的问题。
修改
不可否认,以下建议的答案是我需要的,而且工作正常,但是经过大量时间花在我的问题上,并且撞到了墙上,我意识到我的问题仍然存在原因太奇怪了。在客户端,UpdatePanel
之外我创建了一个<asp:HiddenField ID="hidfieldforROI1" runat="server"/>
,我试图获得它的价值
var dataforROI1 = document.getElementById('<%= hidfieldforROI1.ClientID %>').value;
在后端,我将Value
设置为hidfieldforROI1 Control。我收到以下奇怪的错误:
error BC30451: 'dataforROI1' is not declared. It may be inaccessible due to its protection level.
我将不胜感激任何建议。
答案 0 :(得分:0)
在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(我的代码段中的TextBox,使可视化更容易)。 HiddenField在Page_load' and in
Button1_Click . The one in
Button1_Click will ofcourse not show up since the
HiddenField is outside the
UpdatePanel . But the properties are still available so you can still use
hidfieldforROI1.ClientID inside the
UpdatePanel`