使用ASP.NET Core 2.0 MVC在一个解决方案的不同项目中共享相同的_layout.cshtml

时间:2018-05-17 08:38:44

标签: asp.net-mvc asp.net-core visual-studio-2017 share asp.net-core-2.0

我们正在开发具有不同功能的多个Intranet网站。我们计划有一个根项目(具有一些基本功能),用户可以从中导航到不同的其他项目。 我们计划所有此类项目都应使用相同的布局_Layout.cshtml。 为此,我们尝试将_Layout.cshtml从“side-projects”链接到根项目。我们使用了VS buildin链接方法,如下所述:https://stackoverflow.com/a/19862471/9641435 该文件在没有任何错误消息的情况下链接到路径/Views/Shared/_Layout.cshtml。但是,如果我们启动其中一个站点项目,则会显示以下错误消息:

  

处理请求时发生未处理的异常。

     

InvalidOperationException:布局视图'_Layout'不可能   位于。搜索了以下位置:   /Views/Home/_Layout.cshtml /Views/Shared/_Layout.cshtml

     

Microsoft.AspNetCore.Mvc.Razor.RazorView.GetLayoutPage(ViewContext   context,string executionFilePath,string layoutPath)

异常堆栈:

  

InvalidOperationException:布局视图'_Layout'不可能   位于。搜索了以下位置:   /Views/Home/_Layout.cshtml /Views/Shared/_Layout.cshtml

     

Microsoft.AspNetCore.Mvc.Razor.RazorView.GetLayoutPage(ViewContext   context,string executionFilePath,string layoutPath)

     

Microsoft.AspNetCore.Mvc.Razor.RazorView + d__18.MoveNext()

     

System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

     

System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)

     

Microsoft.AspNetCore.Mvc.Razor.RazorView + d__14.MoveNext()

     

System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

     

System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)

     

Microsoft.AspNetCore.Mvc.ViewFeatures.ViewExecutor + d__22.MoveNext()

     

System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

     

System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)

     

Microsoft.AspNetCore.Mvc.ViewFeatures.ViewExecutor + d__21.MoveNext()

     

System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

     

System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)

     

Microsoft.AspNetCore.Mvc.ViewResult + d__26.MoveNext()

     

System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

     

System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)

     

Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker + d__19.MoveNext()

     

System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

     

System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)

     

Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker + d__24.MoveNext()

     

System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

     

Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResultExecutedContext   上下文中)

     

Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(ref state next,   ref范围范围,ref对象状态,ref bool isCompleted)

     

Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker + d__22.MoveNext()

     

System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

     

Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext   上下文中)

     

Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(ref state next,   ref范围范围,ref对象状态,ref bool isCompleted)

     

Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker + d__17.MoveNext()

     

System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

     

System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)

     

Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker + d__15.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.DeveloperExceptionPageMiddleware + d__7.MoveNext()

我们尝试使用此解决方案修复它:https://stackoverflow.com/a/24079584/9641435但插入该代码并未改变任何内容。

我们正在寻找解决问题的解决方案,或者更好地解决整体问题。

2 个答案:

答案 0 :(得分:0)

我发现在构建站点时确实会复制链接的.cshtml文件,但会将它们复制到build bin文件夹中。在我的Startup.cs中,我添加了以下额外区域路由:-

if (Env.IsDevelopment()) { services.Configure<Microsoft.AspNetCore.Mvc.Razor.RazorViewEngineOptions>(options => { options.AreaViewLocationFormats.Add("/bin/Debug/netcoreapp2.1/Areas/{2}/Views/{1}/{0}.cshtml"); }); }

您的路径可能会有所不同,但是如果您打开解决方案,您应该能够使此答案生效。

使用WebPublishMethod MSDeploy发布到运行IIS的生产Web服务器时,我不需要此步骤。

答案 1 :(得分:0)

我认为您不必让视图复制到输出目录中,而只需将build属性设置为content,从而在csproj文件中产生以下代码:

<ItemGroup> <Content Include="..\shared\path\to\_Layout.cshtml" Link="Views/Shared/_Layout.cshtml" /> </ItemGroup>