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

Blazor Server引入Black Dashboard模板后自定义脚本与MudBlazor冲突如何解决

问题根因

Blazor Server启用预渲染时,$(document).ready()会在预渲染DOM加载完成后立刻执行自定义脚本并绑定事件,但Blazor初始化完成后会替换掉所有预渲染的DOM节点,导致之前绑定的事件全部失效,选中的DOM元素也不再存在,所以自定义功能无法触发。而删除blazor.server.js后Blazor不会替换DOM,所以自定义脚本正常,但MudBlazor依赖Blazor运行时,所以组件功能异常。

解决方案

1. 调整事件绑定方式

将直接绑定到DOM元素的事件改为委托到document上,避免Blazor动态替换DOM后事件丢失。

2. 调整脚本执行时机

不要用$(document).ready()触发初始化,改为监听Blazor初始化完成事件,等Blazor替换完DOM后再执行初始化逻辑。

3. 替换自定义脚本部分

把你原来_Host.cshtml里的两个$(document).ready()代码块,替换为如下代码:

// 全局变量声明
let $sidebar, $navbar, $main_panel, $full_page, $sidebar_responsive;
let sidebar_mini_active = true, white_color = false;
let window_width, fixed_plugin_open;

// 初始化Dashboard核心逻辑
function initBlackDashboard() {
    $sidebar = $('.sidebar');
    $navbar = $('.navbar');
    $main_panel = $('.main-panel');
    $full_page = $('.full-page');
    $sidebar_responsive = $('body > .navbar-collapse');
    window_width = $(window).width();
    fixed_plugin_open = $('.sidebar .sidebar-wrapper .nav li.active a p').html();
}

// 所有事件绑定改为委托到document
$(document).on('click', '.fixed-plugin a', function (event) {
    if ($(this).hasClass('switch-trigger')) {
        event.stopPropagation?.() || (window.event && (window.event.cancelBubble = true));
    }
});

$(document).on('click', '.fixed-plugin .background-color span', function () {
    $(this).siblings().removeClass('active');
    $(this).addClass('active');
    const new_color = $(this).data('color');
    $sidebar?.attr('data', new_color);
    $main_panel?.attr('data', new_color);
    $full_page?.attr('filter-color', new_color);
    $sidebar_responsive?.attr('data', new_color);
});

$(document).on('switchChange.bootstrapSwitch', '.switch-sidebar-mini input', function () {
    if (sidebar_mini_active) {
        $('body').removeClass('sidebar-mini');
        sidebar_mini_active = false;
        blackDashboard.showSidebarMessage('Sidebar mini deactivated...');
    } else {
        $('body').addClass('sidebar-mini');
        sidebar_mini_active = true;
        blackDashboard.showSidebarMessage('Sidebar mini activated...');
    }
    const simulateWindowResize = setInterval(() => window.dispatchEvent(new Event('resize')), 180);
    setTimeout(() => clearInterval(simulateWindowResize), 1000);
});

$(document).on('switchChange.bootstrapSwitch', '.switch-change-color input', function () {
    $('body').addClass('change-background');
    setTimeout(() => {
        $('body').removeClass('change-background');
        if (white_color) {
            $('body').removeClass('white-content');
            white_color = false;
        } else {
            $('body').addClass('white-content');
            white_color = true;
        }
    }, 900);
});

$(document).on('click', '.light-badge', () => $('body').addClass('white-content'));
$(document).on('click', '.dark-badge', () => $('body').removeClass('white-content'));

// 等Blazor初始化完成后执行初始化
window.addEventListener('load', () => {
    Blazor.addEventListener('afterStarted', () => {
        initBlackDashboard();
        window.demo?.initDashboardPageCharts();
    });
});

4. 可选样式优化

你当前的CSS引入顺序是正确的(MudBlazor样式在前,Black Dashboard样式在后),如果出现个别组件样式冲突,可自定义优先级更高的CSS规则覆盖即可。

5. 页面跳转兼容(可选)

如果切换页面后Dashboard状态异常,可在布局组件的OnAfterRenderAsync生命周期中调用initBlackDashboard()方法,每次页面渲染完成后重新初始化即可。


内容的提问来源于stack exchange,提问作者Duy Khương

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 13:45:04