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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 07:42:59