You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ASP.NET C#后台调用JS函数实现Highcharts图表同步缩放

问题:ASP.NET中C#后台配置Highcharts X轴SetExtremes事件实现同步缩放

我在ASP.NET项目中使用C#后台生成Highcharts图表,所有图表数据均由后台填充,而非前端JavaScript创建。已编写纯JS函数syncExtremes用于同步所有图表的缩放级别,但在后台配置X轴SetExtremes事件调用该函数时始终失败,需要可行的配置示例。

现有同步缩放JS函数

function syncExtremes(e) {
            var thisChart = this.chart;

            const shouldShowResetZoom = !(e.min === undefined && e.max === undefined);

            if (e.trigger !== 'syncExtremes') { // 防止反馈循环
                Highcharts.each(Highcharts.charts, function (chart) {
                    if (chart !== thisChart) {
                        if (chart.xAxis[0].setExtremes) { // 更新时该值可能为null
                            chart.xAxis[0].setExtremes(
                                e.min,
                                e.max,
                                undefined,
                                false,
                                { trigger: 'syncExtremes' }
                            );
                        }
                    }

                    if (shouldShowResetZoom && !chart.resetZoomButton) {
                        chart.showResetZoom();
                    } else if (!shouldShowResetZoom && chart.resetZoomButton) {
                        chart.resetZoomButton = chart.resetZoomButton.destroy();
                    }
                });
            }
        }

C#后台图表生成代码

// 小型温度图表覆盖层
chartTemp = new Highcharts("chartTemp").InitChart(new Chart
{
    ZoomType = ZoomTypes.Xy,
    Height = 320,
    MarginTop = 100
})
.SetPlotOptions(options)
.SetXAxis(new XAxis
{
    Type = AxisTypes.Datetime,
    Title = new XAxisTitle { Text = "Date / Time" },
    TickmarkPlacement = Placement.On,
    Labels = new XAxisLabels
    {
        Formatter = @"function(){if((this.axis.getExtremes().max - this.axis.getExtremes().min) <= 86400000) {return Highcharts.dateFormat('%H:%M', this.value);} if((this.axis.getExtremes().max - this.axis.getExtremes().min) > 86400000 && (this.axis.getExtremes().max - this.axis.getExtremes().min) <= 1728000000) {return Highcharts.dateFormat('%m/%e %H:%M', this.value);} if((this.axis.getExtremes().max - this.axis.getExtremes().min) > 1728000000 && (this.axis.getExtremes().max - this.axis.getExtremes().min) <= 25920000000) {return Highcharts.dateFormat('%m/%e', this.value);} if((this.axis.getExtremes().max - this.axis.getExtremes().min) > 25920000000) {return Highcharts.dateFormat('%m/%y', this.value);}}",
    },
    TickPositioner = TickPositionerLarge,
    Events = { SetExtremes = "syncExtremes" }
    // 尝试过的其他写法均失败
    // Events = { SetExtremes = "syncExtremes(e)" }
    // Events = { SetExtremes = "{ trigger: 'syncExtremes' }" }
})
.SetCredits(new Credits { Enabled = false })
.SetSeries(new Series[]
{
    new Series { Name = "Temperature", Data = new Data(mynewArray), Type = ChartTypes.Line, Color = Color.Red }
})
.SetTitle(new Title
{
    Text = "Temperature",
    Align = HorizontalAligns.Center,
    Style = "fontSize: '16px',fontFamily: 'Rockwell'"
})
.SetLegend(new Legend { Enabled = false })
.SetYAxis(yAxis[0])
.SetSubtitle(new Subtitle
{
    Align = HorizontalAligns.Center
});
ltrChartTemperature.Text = chartTemp.ToHtmlString();

ASP前端代码

<div id="container1">
  <asp:Literal ID="ltrChartTemperature" runat="server"> </asp:Literal>
</div>

图表本身运行正常,仅需解决同步缩放的事件配置问题。


可行解决方案

1. 修正JS函数的转义问题

原函数中的&amp;&amp;是HTML转义字符,需替换为原生JS的&&,否则会导致函数执行报错:

function syncExtremes(e) {
    var thisChart = this.chart;

    const shouldShowResetZoom = !(e.min === undefined && e.max === undefined);

    if (e.trigger !== 'syncExtremes') { // 防止反馈循环
        Highcharts.each(Highcharts.charts, function (chart) {
            if (chart !== thisChart) {
                if (chart.xAxis[0].setExtremes) { // 更新时该值可能为null
                    chart.xAxis[0].setExtremes(
                        e.min,
                        e.max,
                        undefined,
                        false,
                        { trigger: 'syncExtremes' }
                    );
                }
            }

            if (shouldShowResetZoom && !chart.resetZoomButton) {
                chart.showResetZoom();
            } else if (!shouldShowResetZoom && chart.resetZoomButton) {
                chart.resetZoomButton = chart.resetZoomButton.destroy();
            }
        });
    }
}

2. 确保JS函数提前加载

将syncExtremes函数放在页面的<head>标签内,或放在Literal控件之前的位置,保证Highcharts初始化时函数已存在。

3. 修正后台SetExtremes配置

在C#的XAxis配置中,SetExtremes只需赋值为函数名称的字符串引用,Highcharts会自动传递事件对象:

.SetXAxis(new XAxis
{
    // 其他配置...
    Events = new XAxisEvents
    {
        SetExtremes = "syncExtremes"
    }
})

4. 统一所有图表的事件配置

确保所有需要同步缩放的图表,在后台配置X轴时都添加相同的SetExtremes = "syncExtremes"配置,这样任意一个图表缩放时,其他图表都会触发同步逻辑。


内容的提问来源于stack exchange,提问作者Riaan Nel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 22:40:48