在我的ASP.NET页面上,我在ASP:UpdatePanel中使用谷歌可视化图表。用户从两个asp:DropDownLists中选择他们想要查看的图表,然后我的C#代码生成JavaScript,然后我调用ScriptManager.RegisterStartipScript(…)。当页面首次加载第一个默认图表时(即第一次调用RegisterStartupScript)工作,我可以从view Source中查看JavaScript。只有在回发时,我才会得到一个空白图表,当我转到"查看源代码"时,页面没有收到新的JavaScript,它仍然有第一次加载页面时的旧默认JavaScript。这是奇怪的行为。如果我使用完全相同的代码,但将我的谷歌图表代码替换为alert(…);那么alert()每次都会触发,当我查看源代码时,脚本就在那里。我尝试了很多不同的东西,也遵循了这样的答案。下面是我的代码,如果有任何帮助,我们将不胜感激,我已经让其他人看了这个,我们都被难住了。仅供参考:如果我删除所有UpdatePanels和相关项目(ScriptManager和UpdateProgress)并使用ClientScript.RegisterStartupScript(),那么一切都会正常工作,我会在页面上获得新的JavaScript代码,新的图表会照原样显示。
<asp:ScriptManager ID="ScriptMgr" runat="server" />
<asp:UpdatePanel ID="UpdatePanelData" runat="server">
<ContentTemplate>
<p>
<asp:DropDownList ID="PlotList" runat="server" AutoPostBack="true" Width="500px"
onselectedindexchanged="PlotList_SelectedIndexChanged"></asp:DropDownList>
<asp:DropDownList ID="RangeList" runat="server" Width="125px"
style="float:right;" AutoPostBack="True"
onselectedindexchanged="RangeList_SelectedIndexChanged">
</asp:DropDownList>
<br />
<asp:Label ID="PlotDescription" runat="server" Width="100%"></asp:Label>
</p>
<div id="chart_material" class="GoogleChart" style="width:100%;height:450px;"></div>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="RangeList" EventName="SelectedIndexChanged" />
<asp:AsyncPostBackTrigger ControlID="PlotList" EventName="SelectedIndexChanged" />
</Triggers>
</asp:UpdatePanel>
<asp:UpdateProgress ID="UpdateProgressData" runat="server" DisplayAfter="500">
<ProgressTemplate>
<div class="LoadingPanel">
<asp:Image ID="LoadingImage" runat="server" ImageUrl="~/Images/loading_2.gif" AlternateText="Loading ..." ToolTip="Loading ..." style="padding: 10px;position:fixed;top:45%;left:50%;" />
</div>
</ProgressTemplate>
</asp:UpdateProgress>
我的C#代码是这样的。函数DisplayPlot是从两个DropDownList事件中调用的,每个列表本身都作为"control"传入。
private void DisplayPlot(Control control)
{
PlotInformation Plot = new PlotInformation(ChartDivID);
double Range = Convert.ToDouble(RangeList.SelectedValue);
string JavaScript = Plot.GetPlotScript(PlotList.SelectedItem.Text, Range);
PlotDescription.Text = Plot.GetDataPlotDescription(PlotList.SelectedItem.Text);
//string TestScript = "<script type="text/javascript">ntalert('" + PlotList.SelectedItem.Text + "');n</script>";
ScriptManager.RegisterStartupScript(control, control.GetType(), ScriptKey, JavaScript, false);
//ScriptManager.RegisterStartupScript(control, this.GetType(), ScriptKey, JavaScript, false);
//if (!ClientScript.IsStartupScriptRegistered(ScriptKey))
// ClientScript.RegisterStartupScript(this.GetType(), ScriptKey, JavaScript);
}
我知道这很晚了,但我在同一个bug上花了很多时间。
尝试更改:
ScriptManager.RegisterStartupScript(control, control.GetType(), ScriptKey,
JavaScript, false);
至
ScriptManager.RegisterStartupScript(UpdatePanelData, UpdatePanelData.GetType(), ScriptKey,
JavaScript, false);