You need to enable JavaScript to run this app. 如何正确将dhtmlxGantt JavaScript组件集成到Blazor的Index.razor页面
优惠活动
大模型
产品
解决方案
定价
更多

如何正确将dhtmlxGantt JavaScript组件集成到Blazor的Index.razor页面

解决方案

问题根因

你当前的问题是:dhtmlxGantt初始化脚本执行时,Blazor还没完成页面渲染,Index.razor里的gantt_here容器还不存在,要么初始化失败,要么直接把甘特图写死在index.html里覆盖了Blazor的挂载节点,导致其他Blazor组件无法加载。

步骤1:修改index.html

保留dhtmlxGantt的静态资源引用,删除原来写在DOMContentLoaded里的初始化逻辑,新增一个全局的甘特图初始化方法:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
  <title>DHX.Gantt</title>
  <base href="/" />
  <link href="css/bootstrap/bootstrap.min.css" rel="stylesheet" />
  <link href="css/app.css" rel="stylesheet" />
  <link href="DHX.Gantt.styles.css" rel="stylesheet" />
  <link href="manifest.json" rel="manifest" />
  <!-- 保留dhtmlx的css和js引用 -->
  <link href="https://cdn.dhtmlx.com/gantt/edge/dhtmlxgantt.css" rel="stylesheet" type="text/css" />
  <script src="https://cdn.dhtmlx.com/gantt/edge/dhtmlxgantt.js"></script>
  <!-- 新增全局初始化方法,删掉原来的DOMContentLoaded监听逻辑 -->
  <script>
    window.initGantt = function() {
      // specifying the date format
      gantt.config.date_format = "%Y-%m-%d %H:%i";
      // initializing gantt
      gantt.init("gantt_here");

      // initiating data loading
      gantt.load("/api/data");
      // initializing dataProcessor
      var dp = new gantt.dataProcessor("/api/");
      // and attaching it to gantt
      dp.init(gantt);
      // setting the REST mode for dataProcessor
      dp.setTransactionMode("REST");
    }
  </script>
  <link rel="apple-touch-icon" sizes="512x512" href="icon-512.png" />
</head>
<body>
  <div id="app">Loading...</div>

  <div id="blazor-error-ui">
    An unhandled error has occurred.
    <a href="" class="reload">Reload</a>
    <a class="dismiss">🗙</a>
  </div>
  <script src="_framework/blazor.webassembly.js"></script>
  <script>navigator.serviceWorker.register('service-worker.js');</script>
</body>
</html>

步骤2:修改Index.razor

在组件渲染完成的生命周期回调里,通过JS互操作调用刚才定义的初始化方法,Razor组件内不允许直接嵌入script标签,必须通过这种方式调用JS逻辑:

@page "/"
@inject IJSRuntime jsRuntime

<h1>Hello, world!</h1>

Welcome to your new app. OOOO 1123154

<SurveyPrompt Title="How is Blazor working for you? jjjj" />

<div id="gantt_here" style="width: 100%; height: 600px;"></div>

@code{
    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        if (firstRender)
        {
            // 只有第一次渲染完成后执行初始化,避免重复初始化
            await jsRuntime.InvokeVoidAsync("initGantt");
        }
        await base.OnAfterRenderAsync(firstRender);
    }
}

注意事项

  • 原来的甘特图容器高度设为100vh会占满整个视口,挤压上方其他Blazor组件的显示空间,可以根据需求调整为固定高度比如600px,或者用flex布局分配高度
  • 如果后续需要把Blazor侧的甘特图数据传递给dhtmlxGantt,可以给initGantt方法加参数,在调用时把C#侧的数据序列化为JSON后传入即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 01:36:00