自从我两年前提出这个问题以来,我一直零散地在研究,现在我相信我已经有了一个99%的非臃肿解决方案。 下面的所有内容都在我的Visual Studio 16.4.5中运行良好。
以下是我关于如何让Razor在控制台和库项目中工作的经验总结。
- 如果您在.NET Core控制台应用程序中创建和使用Razor文件,则似乎不会出现任何问题。
- 您还可以将Razor文件放在.NET Standard库中,并从.NET Core控制台应用程序中使用它们,尽管在这种情况下,解决方案资源管理器中存在一些微小的丑陋。但我认为这对功能没有任何影响。
- 无论哪种方式,@model和@using关键字都能正常工作,Intellisense也能正常工作,lambda表达式也能正常工作,似乎一切都正常。
以下是您需要做的:
要添加Razor文件:
添加新的HTML文件,但将文件命名为.cshtml
扩展名。
在解决方案资源管理器中选择该文件。在属性窗口中,在“自定义工具”下输入RazorTemplatePreprocessor
。一个.cs
文件将立即生成。
要使用生成的类:
var razor = new MyRazorClass();
razor.Model = "Hello from Razor";
var html = razor.GenerateString();
Console.WriteLine(html);
为了解决错误列表中的错误(顺便提一句,这些错误似乎并不影响功能,但肯定会造成心理干扰):
请添加以下NuGet引用:
Microsoft.AspNetCore.Mvc.Core
Microsoft.AspNetCore.Mvc.Razor
如果你将 Razor 文件添加到 .NET Standard 库中,你会得到一堆以下的错误:
Feature 'nullable reference types' is not available in C
为了解决这个问题,请在项目文件中添加以下两行代码:
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<Nullable>enable</Nullable> <!
<LangVersion>8.0</LangVersion> <!
</PropertyGroup>
此时,该项目应该可以无错误或警告地编译!
但是,它并不完美。存在一些奇怪的问题,这让我担心未来可能会出现意外的问题。
只有在使用来自.NET Standard库的Razor文件时才会出现这些问题:
- 解决方案资源管理器有时以两种不同的方式显示
.cshtml
文件的后代:
a. 在我认为是正确的方式下,.cshtml
文件只有一个生成的.cs
文件作为其后代。该文件又有两个生成的类YourRazorClass
和YourRazorClassBase
。每个类成员都可以展开以显示其具有易读名称的类成员。
b. 但是,有时会出现一个下划线前缀的类作为.cshtml
文件的直接后代(例如_MyTestRazorClass
),它的类成员也不同。
这似乎会在解决方案资源管理器中出现和消失,并且我认为它不会造成任何损害,但是它肯定会在你思考到底发生了什么时造成一些精神混乱。
- 在解决方案资源管理器中,在
[项目名称]
>依赖项
>分析器
下,有一堆警告会传播到消费该库的任何项目的同一部分。这也会造成精神混乱。幸运的是,您可以通过执行以下操作关闭它们:
a.右键单击项目,选择属性
。
b.在代码分析
下,取消选中构建时运行
和实时分析时运行
框。
最后一个注意事项:我尚未测试过在Xamarin项目中以此方式设置的.NET Standard库(这是让我开始这个过程的场景),但我将来会进行测试并在那时更新此答案。
更新: 我现在已经在发布的Xamarin应用程序中使用了这个技术!唯一的怪事是你不能复制. cshtml文件来创建一个新的。它会破坏原始文件和副本,你必须编辑项目文件来修复问题。相反,每次都像上面描述的手动添加一个新文件。
我希望这可以帮助到某些人。如果有人发现了解决方案资源管理器中的奇怪问题,请告诉我!