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

在WebPack中添加自定义JS并通过MVC HTML Helper调用的问题

问题根因

webpack 默认会将所有模块代码封装在独立的闭包作用域中,你在模块内部定义、导入的函数默认不会暴露到全局 window 对象上,而 Razor 里写的内联 onchange="EventChange()" 事件会从全局作用域查找对应函数,自然找不到对应的方法。
另外你当前的代码还有一个导入语法错误:eventMessage.js 用的是命名导出,site.js 里用默认导入的写法拿到的会是 undefined。


修复方案

方案1:保留内联onchange写法(快速修复)

  1. 修正 site.js 的导入语法,同时把函数挂载到全局window对象:
// 把原来的 import EventChange from '../js/eventMessage'; 改成下面的写法
import { EventChange } from '../js/eventMessage';
// 挂载到全局,供内联事件调用
window.EventChange = EventChange;

console.log('The \'site\' bundle has been loaded!');
  1. 确保你的布局页/Index.cshtml 已经正确引入webpack打包后的产物:
<!-- 放在body标签末尾,确保DOM加载完成后执行 -->
<script src="~/dist/site.entry.js"></script>

方案2:移除内联事件,用jQuery绑定(更符合模块化规范,推荐)

这种方式不需要污染全局作用域,更符合webpack模块化的设计思路:

  1. 修正 site.js 的导入语法,添加事件绑定逻辑:
import $ from 'jquery'; // 确保导入jQuery实例
import { EventChange } from '../js/eventMessage';

// 页面DOM加载完成后绑定事件
$(document).ready(function() {
  $('.EditCheckbox').on('change', EventChange);
});

console.log('The \'site\' bundle has been loaded!');
  1. 删掉 EditorFor 里的 onchange = "EventChange()" 参数即可。

额外说明

你webpack配置的entry里额外配置了event: './src/js/eventMessage.js',如果没有单独拆分这个包的需求可以删掉,你已经在site.js里导入了相关逻辑,不需要单独打包。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:36:02