剃刀无法找到类型或命名空间

时间:2017-07-26 19:14:43

标签: razor asp.net-core asp.net-core-mvc

我与this one有一个非常非常相似的问题。

  

您好。
  我有一个针对.NET 4.61的应用程序(服务),并试图使用WebListener转移到AspNetCore自托管主机。
  我试图通过在控制台应用程序中测试它来调查这些要求   我创建的项目是一个普通的Windows控制台应用程序,我使用nuget引用了所有必需的包,并创建了所需的Startup类,并使用WebHostBuilder创建并启动了主机。

(我没有正常的Windows控制台应用程序,但我的ubuntu笔记本电脑上有一个dotnet控制台应用程序)

我们之前尝试和测试的内容有所不同。

到目前为止,我刚刚制作了HomeControllerIndex使用string返回"Hello world"。跑完应用程序,转到localhost并得到响应。完美。

现在我添加的是Index返回View()返回IActionResult。然后我在Index.cshtml中创建了一个/Views/Home/文件,现在我明白了:

堆栈跟踪:

  

失败:Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware [0]         发生了未处理的异常:发生了一个或多个编译失败:

接下来是150行,如下所示:

  

gee1fd0w.wuj(4,11):错误CS0246:类型或命名空间名称'系统'找不到(你错过了使用指令或汇编引用吗?)
        gee1fd0w.wuj(5,11):错误CS0246:类型或命名空间名称'系统'找不到(你错过了使用指令或汇编引用吗?)
        gee1fd0w.wuj(6,11):错误CS0246:类型或命名空间名称'系统'找不到(你错过了使用指令或汇编引用吗?)
  ...
  gee1fd0w.wuj(37,13):错误CS0518:预定义类型' System.Object'没有定义或导入
  gee1fd0w.wuj(37,13):错误CS0518:预定义类型' System.Void'未定义或导入

以:

结尾
  

gee1fd0w.wuj(33,36):错误CS0161:' _Views_Home_Index_cshtml.ExecuteAsync()':并非所有代码路径都返回值
     在Microsoft.AspNetCore.Mvc.Razor.Compilation.CompilationResult.EnsureSuccessful()
     在Microsoft.AspNetCore.Mvc.Razor.Internal.CompilerCache.CreateCacheEntry(String relativePath,String normalizedPath,Func' 2 compile)
  ---从抛出异常的先前位置开始的堆栈跟踪结束---

其次是:

  

at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
     在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)
     在Microsoft.AspNetCore.Mvc.Razor.Internal.CompilerCache.GetOrAdd(String relativePath,Func' 2 compile)
     在Microsoft.AspNetCore.Mvc.Razor.Internal.DefaultRazorPageFactoryProvider.CreateFactory(String relativePath)
     在Microsoft.AspNetCore.Mvc.Razor.RazorViewEngine.CreateCacheResult(HashSet`1 expirationTokens,String relativePath,Boolean isMainPage)
     在Microsoft.AspNetCore.Mvc.Razor.RazorViewEngine.OnCacheMiss(ViewLocationExpanderContext expanderContext,ViewLocationCacheKey cacheKey)
     在Microsoft.AspNetCore.Mvc.Razor.RazorViewEngine.LocatePageFromViewLocations(ActionContext actionContext,String pageName,Boolean isMainPage)
     在Microsoft.AspNetCore.Mvc.Razor.RazorViewEngine.FindView(ActionContext context,String viewName,Boolean isMainPage)
     在Microsoft.AspNetCore.Mvc.ViewEngines.CompositeViewEngine.FindView(ActionContext context,String viewName,Boolean isMainPage)
     在Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.ViewResultExecutor.FindView(ActionContext actionContext,ViewResult viewResult)
     在Microsoft.AspNetCore.Mvc.ViewResult.d__26.MoveNext()
  ---从抛出异常的先前位置开始的堆栈跟踪结束---

接下来是一系列较短的堆栈跟踪:

  

at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
  在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)
     在Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__30.MoveNext()
  ---从抛出异常的先前位置开始的堆栈跟踪结束---
     在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
     在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)
     在Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__28.MoveNext()
  ---从抛出异常的先前位置开始的堆栈跟踪结束---
     在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
     在Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ResultExecutedContext context)
     在Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next,Scope& scope,Object& state,Boolean& isCompleted)
     在Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__22.MoveNext()
  ---从抛出异常的先前位置开始的堆栈跟踪结束---      在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
     在Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ResourceExecutedContext context)
     在Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next,Scope& scope,Object& state,Boolean& isCompleted)
     在Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__20.MoveNext()
  ---从抛出异常的先前位置开始的堆栈跟踪结束---
     在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
     在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)
     在Microsoft.AspNetCore.Builder.RouterMiddleware.d__4.MoveNext()   ---从抛出异常的先前位置开始的堆栈跟踪结束---
     在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
     在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)
     在Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.d__6.MoveNext()

堆栈跟踪结束

现在我不确定我是否完全理解上一张海报所得到的答案:

  

Mvc的运行时编译依赖于DependencyContext(deps文件)来查找仅在使用dotnet CLI编译时生成的编译引用。您必须添加编译引用作为应用程序启动的一部分,以便进行视图编译。

我确实是通过dotnet cli编译的,但是我还缺少其他的东西吗?当我尝试通过运行dotnet new mvc复制我的项目并删除除控制台项目中的所有内容之外的所有内容。它像雨一样正常运行,我从我的Index.cshtml中获得了hello world。

Instinct告诉我,问题出在一些文件差异,但我已经将所有文件区分开来,但我找不到任何差异,只有app-name。我本可以错过一些东西,但我想知道它是否可能是我不知道的自动化的东西?

编辑:

找到了问题,看起来它们生成的bin/debug/netcoreapp1.1/<appname>.deps.json有所不同。相当多的差异,现在就去研究一下。但是,如果我将该文件从mvc-project复制粘贴到控制台应用程序,一切运行正常。

不幸的是,控制台应用程序deps.json - 文件长度超过1300行,而mvc应用程序版本长度超过4300行,因此我不完全确定通过它并确定原因工作,而另一个没有。

编辑:

它似乎主要是很多依赖范围不同,很多mvc依赖范围都包含"NETStandard.Library": "1.6.1"的依赖,但也有很多其他范围。还有一堆控制台应用程序没有的编译范围。

事实上,这似乎是唯一的区别。 mvc-application的deps.json文件似乎还有大约3000行的依赖项和编译范围。因此,我认为我会放弃弄清楚导致问题的原因,以及我计划如何将控制台应用程序构建到mvc-app中的计划&#34; :)

我会在这里留下问题,以防有人发现自己处于类似情况。

4 个答案:

答案 0 :(得分:7)

我以前曾经遇到过这种情况。

执行dotnet restore并删除您的objbin目录。

我可能在技术上不正确,但我认为这里发生的事情是你的旧构建与你的新构建产生冲突,它有新的(或不同的)引用。

答案 1 :(得分:1)

这应该通过使用dotnet restore来修复。

编辑:没关系,我看到评论已经回答了。

答案 2 :(得分:0)

当我将某些类移到子目录并更改其名称空间时,我遇到了同样的问题。就我而言,仅删除objbin目录以及运行dotnet restore是不够的。

如果您使用完整路径作为模型引用,则必须更改所有cshtml文件(例如, _ViewImports.cshtml )中对旧文件夹的所有引用。因此,从using ProjectName.Modelsusing ProjectName.Models.NewDirectory,依此类推。然后删除obj bin并运行dotnet命令。

答案 3 :(得分:0)

我在(ASP).NET Core项目中遇到了这个问题。根本原因是因为我错误地删除了Razor页面的后备类(我删除的.cshtml.cs文件)后,.csproj文件已自动更新。 .csproj文件捕获了一个更新,该更新明确使PageModel类不在的生成范围内,从而导致错误。

背景信息: 我错误地删除了PageModel文件(.cshtml.cs),但很快通过我的Git存储库撤消了删除操作。我没有意识到.csproj文件也已更新。