如何在CSHTML(Razor)页面中正确引入外部React脚本并解决加载与渲染问题?
如何在CSHTML(Razor)页面中正确引入外部React脚本并解决加载与渲染问题?
兄弟,我仔细看了你的代码和遇到的问题(找不到脚本、加载失败+预编译警告),发现了几个核心问题,咱们一个个来修复:
1. 先解决React版本不兼容的致命问题
你在布局里引入的是React 16的UMD包,但你的paymentOptions.js里用了createRoot——这是React 18才新增的API!React 16根本没有这个方法,这肯定会导致渲染失败。
修复方案二选一:
- 方案A:升级布局里的React到18版本(推荐,因为16已经是旧版本了):
<!-- 替换布局里的React脚本 --> <script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script> <script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script> - 方案B:如果非要用React 16,把
paymentOptions.js里的createRoot改成React 16的写法:// 替换原来的createRoot代码 ReactDOM.render(<PaymentOptions />, document.getElementById('payment-options'));
2. 修复React组件的代码错误
你的PaymentOptions类组件写得不对——类组件里的渲染逻辑要放在render()方法里,而不是和组件同名的方法;同时要删掉无用的import语句(因为你用的是全局UMD版React,浏览器里不支持模块import语法):
// 修正后的paymentOptions.js组件代码 class PaymentOptions extends React.Component { // 这里要写render方法,不是PaymentOptions()! render() { return ( <div> <h1>Payment Options Details Go Here</h1> </div> ); } } // 如果你用React 18,保留这段;用React 16就换成ReactDOM.render const domNode = document.getElementById('payment-options'); const root = ReactDOM.createRoot(domNode); // UMD包的API挂在全局ReactDOM上 root.render(<PaymentOptions />);
3. 解决脚本找不到/加载失败的问题
你在Order.cshtml里的脚本引用有两个小问题:
- 路径写法:ASP.NET Core中
wwwroot是静态文件根目录,正确路径应该用~/js/paymentOptions.js,配合Razor的Url.Content()确保路由正确 - 脚本位置:你把脚本放在了
siteMenu区块的容器里,应该移到布局预留的scripts区块,确保脚本在React核心库之后加载,避免"React is not defined"报错
修复后的Order.cshtml关键代码:
<!-- 把自定义脚本移到scripts区块 --> @section scripts { <script type="text/babel" src="@Url.Content("~/js/paymentOptions.js")"></script> } @section siteMenu { <!-- 你的导航菜单代码不变 --> <div name="Order UI"> <form> <!-- 你的披萨选择表单代码不变 --> <!-- 只留容器,脚本已经移到scripts区块 --> <div id="payment-options"></div> <input type="submit" value="Place Order" /> </form> </div> }
另外要确认:
wwwroot/js/paymentOptions.js文件确实存在- 项目的
Program.cs/Startup.cs里已经添加了静态文件中间件(ASP.NET Core默认自带,但如果手动删了要加回来:app.UseStaticFiles();)
4. 处理预编译警告
你看到的"要预编译脚本"警告,是因为用了babel-standalone在浏览器里实时编译JSX——这只适合开发阶段快速测试,性能很差,生产环境绝对不能用。
开发阶段可以直接忽略这个警告,等要上线的时候,用Webpack、Vite这类工具把React代码预编译成原生JS文件,再替换掉babel-standalone的依赖即可。
最后整合验证
按照上面的步骤改完后,刷新页面:
- 脚本找不到的错误会消失
- React组件会正常渲染在
payment-options容器里 - 版本不兼容的报错也会解决
内容来源于stack exchange
相关产品推荐
相关产品推荐

