给定项目中引用的库。该库具有预编译视图(请参阅此post如何实现它)。所以lib有ABC.dll和ABC.PrecompiledViews.dll程序集。
/Views/Shared/Index.cshtml
内的库中有一个视图。还有一个让它回归的控制器。
然后我有一个应用程序引用库(两个程序集)。 MVC在运行时发现并返回索引视图。
现在我在Views/Shared/Index.cshtml
中的应用程序内创建一个视图。因此它的相对名称与引用视图中的相对名称相同。我这样做是指我想要覆盖库中的视图。
从VS(Ctrl-F5)启动应用程序时,它可以正常工作但应用程序中的视图会被忽略。
发布应用程序时(dotnet publish
),应用程序在启动时失败,并显示以下错误:
InvalidOperationException: The following precompiled view paths differ only in case, which is not supported:
/Views/Shared/Index.cshtml
/Views/Shared/Index.cshtml
Microsoft.AspNetCore.Mvc.Razor.Internal.RazorViewCompiler..ctor(IFileProvider fileProvider,RazorTemplateEngine templateEngine,CSharpCompiler csharpCompiler,动作compilationCallback,IList的precompiledViews,ILogger记录器)
除了从VS运行时忽略视图的问题,这是有意义的行为。该应用程序有两个相似的视图,无法理解选择哪一个。
所以问题是如何强制MVC使用特定视图(来自app而不是lib)?
当属于不同的控制器时,有一种方法可以将具有相同相对名称的视图分开。这是一个很好的讨论 - Restrict route to controller namespace in ASP.NET Core 但我的情况有点不同。