ASP.NET中的Angular2 - 未定义窗口

时间:2017-09-05 01:17:04

标签: angular asp.net-core-mvc

我是Angular2的新手,并且非常擅长将它整合到ASP.NET Web应用程序中。 当我尝试在Angular2 ASP.NET Web应用程序中构建调试模式时出现此错误。在发布模式下构建时出现了同样的错误。

Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware[0] An unhandled exception has occurred while executing the request Microsoft.AspNetCore.NodeServices.HostingModels.NodeInvocationException: Prerendering failed because of error: ReferenceError: window is not defined at D:\Projects\BryterOpsAdmin\BryterOpsAdmin\ClientApp\dist\vendor.js:89981:21 at Object.<anonymous> (D:\Projects\BryterOpsAdmin\BryterOpsAdmin\ClientApp\dist\vendor.js:90732:3) at Object.<anonymous> (D:\Projects\BryterOpsAdmin\BryterOpsAdmin\ClientApp\dist\vendor.js:90734:30) at __webpack_require__ (D:\Projects\BryterOpsAdmin\BryterOpsAdmin\ClientApp\dist\vendor.js:21:30) at Object.<anonymous> (D:\Projects\BryterOpsAdmin\BryterOpsAdmin\ClientApp\dist\vendor.js:85385:1) at Object.<anonymous> (D:\Projects\BryterOpsAdmin\BryterOpsAdmin\ClientApp\dist\vendor.js:85386:30) at __webpack_require__ (D:\Projects\BryterOpsAdmin\BryterOpsAdmin\ClientApp\dist\vendor.js:21:30) at Object.<anonymous> (D:\Projects\BryterOpsAdmin\BryterOpsAdmin\ClientApp\dist\main-server.js:20466:42) at __webpack_require__ (D:\Projects\BryterOpsAdmin\BryterOpsAdmin\ClientApp\dist\main-server.js:20:30) at Object.exports.REPLACEMENT_CHARACTER (D:\Projects\BryterOpsAdmin\BryterOpsAdmin\ClientApp\dist\main-server.js:398:79) Current directory is: D:\Projects\BryterOpsAdmin\BryterOpsAdmin

我刚刚对mvc方面的模型类进行了一些无关紧要的更改,所以当我收到此错误时,我还原了我的更改并再次尝试。 我仍然收到这个错误。根据我的源代码控制,自上次正常工作以来,一直没有任何变化。 可能导致此错误的原因是什么?我完全不知道甚至要去寻找什么。

我搜索了StackOverflow有关的任何内容,但除了这个问题之外我没有找到任何适用于asp.net的内容:Prerendering failed because of error: ReferenceError: window is not defined 从来没有回答。

我尝试删除隐藏的obj和bin文件夹无效。

提前谢谢。

更新: 我尝试直接导航到我网站上的一个页面,它已成功完成。似乎Angular2不再自动路由。我仍然通过MVC('Home / Index')访问Home Controller和Home Index.cshtml视图,所以这看起来像是一个Angular2问题。

这就是我的angular2路由的样子。

`

RouterModule.forRoot([
            { path: '', redirectTo: 'home', pathMatch: 'full' },
            { path: 'home', component: HomeComponent },
            { path: 'counter', component: CounterComponent },
            { path: 'fetch-data', component: FetchDataComponent },
            { path: 'bryterUsers', component: BryterUsersComponent },
            { path: 'adminUsers', component: AdminUsersComponent },
            { path: 'retailers', component: RetailersComponent },
            { path: 'providers', component: ProvidersComponent },
            { path: '**', redirectTo: 'home' }
        ])`

UPDATE2:我现在无法再导航到任何其他页面了。无论我走到哪里,我都会得到'窗口未定义'错误。我的代码中没有更改任何内容。我完全难过了。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:3)

我在这里找到了答案,虽然我不知道答案是否正确:

Prerendering failed because of error: ReferenceError: Event is not defined with PrimeNG AutoComplete

以下是他们的所作所为:

“我能够通过更改ASP.Net核心模板生成的Index.cshtml页面中的asp-prerender标记来解决这个问题。我从我的问题中忽略了关于ASP.Net核心模板的观点。

我从

更改了标签

<app asp-prerender-module="ClientApp/dist/main-server">Loading...</app>

<app asp-ng2-prerender-module="ClientApp/dist/main-server">Loading...</app>

这解决了我的问题,但我不知道这是否是最佳做法。

答案 1 :(得分:2)

当您向app.module.shared.ts添加依赖于window变量的内容时,会导致此错误,该变量仅在浏览器中不在服务器上可用。很难弄清楚Hit n Trial是什么引起了这个问题但是现在唯一的解决方案。

找到那件事并将其移至app.module.browser.ts

@techgeekster的解决方案可行,但我会禁用服务器端渲染。

参考:GitHub Issue

答案 2 :(得分:0)

就我而言,它是在服务器端预渲染时使用window.location.origin

查找window.location.origin的任何用法并检查它是否仅用于客户端