自从我近两年前提出这个问题以来,我一直在零星地研究这个问题,我相信我有一个 99% 不笨重的解决方案。下面的一切都适合我视觉工作室16.4.5.
以下是我了解到的有关让 Razor 在控制台和库项目中工作的知识。
- 如果在 .NET Core 控制台应用程序中创建和使用 Razor 文件,一切似乎都可以轻松完成。
- 您还可以将 Razor 文件放入 .NET Standard 库中,并从 .NET Core 控制台应用程序使用它们,尽管在这种情况下,解决方案资源管理器中存在一些小问题。不过,我认为它对功能没有任何影响。
- 无论哪种方式,两者
@model
和@using
关键字工作正常,智能感知工作正常,lambda 表达式工作正常,一切似乎都工作正常。
这是你必须做的:
添加 Razor 文件:
添加一个新的 HTML 文件,但用.cshtml
扩大。
在解决方案资源管理器中选择该文件。在“属性”窗口的“自定义工具”下,输入RazorTemplatePreprocessor
. A .cs
文件将立即生成。
使用生成的类:
var razor = new MyRazorClass();
razor.Model = "Hello from Razor"; // Assumes @model string in the Razor file; custom classes are fine too.
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# 7.3. Please use language version 8.0 or greater.
要解决此问题,请将以下两行添加到项目文件中:
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<Nullable>enable</Nullable> <!-- Add this line -->
<LangVersion>8.0</LangVersion> <!-- Add this line -->
</PropertyGroup>
此时,该项目应该可以编译,没有错误或警告!
然而,它并不完美。有一些奇怪的地方,这让我担心将来事情可能会出乎意料地发生在我身上。
这些问题似乎仅在使用 .NET 标准库中的 Razor 文件时才会出现:
- 解决方案资源管理器有时会显示该解决方案的后代
.cshtml
以两种不同的方式归档:
A。以我认为正确的方式,.cshtml
文件的唯一后代是生成的.cs
文件。该文件又具有两个生成的类,YourRazorClass
and YourRazorClassBase
。其中每一个都可以扩展以显示类成员,这些成员具有漂亮的、人类可读的名称。
b.然而,有时,以下划线前缀的类会显示为该类的直接后代.cshtml
文件(例如,_MyTestRazorClass
),而且,它的类成员也不同。
这似乎在解决方案资源管理器中出现和消失,我认为它不会造成任何伤害,但当您想知道到底发生了什么时,它肯定会造成一些精神混乱。
- 在解决方案资源管理器中,在
[Project Name]
> Dependencies
> Analyzers
,有一堆警告会传播到使用该库的任何项目的同一部分。这也会造成精神混乱。幸运的是,您可以通过执行以下操作来关闭它们:
A。右键单击该项目并选择Properties
。
b.在下面Code Analysis
,取消选中Run on Build
and Run on Live Analysis
boxes.
最后一点:我还没有在 Xamarin 项目中使用以这种方式设置的 .NET Standard 库进行测试(这是最初让我走这条路的场景),但我将来会这样做并更新
当时这个答案。
UPDATE:我现在已在发布的 Xamarin 应用程序中使用了此技术!唯一奇怪的是,您无法复制粘贴 .cshtml 文件来创建新文件。它搞砸了原始文件和副本,您必须编辑项目文件才能修复问题。相反,只需每次按照上述方式手动添加一个新文件即可。
我希望这可以帮助别人。如果有人弄清楚解决方案资源管理器中的奇怪现象是怎么回事,我很想知道!