Bri*_*Rak 11 c# console-application razor
我知道之前已经提出了类似的问题,但唯一的答案是六年了,人们提到的项目似乎没有被维护.
我想在控制台应用程序或类库中使用Razor来呈现HTML.我还想在.cshtml文件中使用Intellisense.
目前,我可以通过以下方式对此进行评审:
Custom Tool为RazorTemplatePreprocessor这会导致识别Razor语法.所以,如果你有Test.cshtml,它会生成一个名为的类Test,你可以这样使用:
var test = new Test();
test.Model = "Hi there";
var html = test.GenerateString();
Console.WriteLine(html);
Run Code Online (Sandbox Code Playgroud)
这对我的目的来说已经足够好了.但是,.cshtml文件中的实际编码体验非常糟糕:
var因为它是C#2.@model关键字无法识别.奇怪的是,如果你忽略所有这些错误,HTML实际上是正确生成的,包括使用Razor引擎抱怨的库和@model关键字.但是,这会导致严重的心理混乱,因为如果您有任意数量的.cshtml文件,您很快就会遇到成千上万的这些错误与真正的错误混在一起.
我能做些什么来使实际的Razor编码体验更像是在ASP.NET Web应用程序中工作吗?
自从我近两年前提出这个问题以来,我一直在零星地研究这个问题,我相信我有一个 99% 不笨重的解决方案。以下所有内容在Visual Studio 16.4.5中都适用于我。
以下是我了解到的有关让 Razor 在控制台和库项目中工作的知识。
@model和@using关键字都可以正常工作,Intellisense 可以正常工作,lambda 表达式可以正常工作,一切似乎都可以正常工作。这是你必须做的:
添加 Razor 文件:
添加新的 HTML 文件,但使用.cshtml扩展名命名该文件。
在解决方案资源管理器中选择该文件。在“属性”窗口的“自定义工具”下,输入RazorTemplatePreprocessor。.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);
Run Code Online (Sandbox Code Playgroud)
要解决错误列表中的错误(顺便说一句,这似乎不会影响功能,但肯定会造成精神混乱):
将 NuGet 引用添加到:
Microsoft.AspNetCore.Mvc.Core
Microsoft.AspNetCore.Mvc.Razor
Run Code Online (Sandbox Code Playgroud)
如果您将 Razor 文件添加到 .NET Standard 库,您将收到一堆以下错误:
Feature 'nullable reference types' is not available in C# 7.3. Please use language version 8.0 or greater.
Run Code Online (Sandbox Code Playgroud)
要解决此问题,请将以下两行添加到项目文件中:
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<Nullable>enable</Nullable> <!-- Add this line -->
<LangVersion>8.0</LangVersion> <!-- Add this line -->
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
此时,该项目应该可以编译,没有错误或警告!
然而,它并不完美。有一些奇怪的事情,这让我担心将来事情可能会出乎意料地发生在我身上。
这些问题似乎仅在使用 .NET 标准库中的 Razor 文件时才会出现:
.cshtml:A。我认为正确的方式是,该.cshtml文件将生成的文件作为其唯一的后代.cs。该文件又具有两个生成的类,YourRazorClass并且YourRazorClassBase. 其中每一个都可以扩展以显示类成员,这些成员具有漂亮的、人类可读的名称。
b. 然而,有时,以下划线前缀的类会显示为.cshtml文件的直接后代(例如,_MyTestRazorClass),而且,其类成员也不同。
这似乎在解决方案资源管理器中出现并消失,我认为它不会造成任何伤害,但当您想知道到底发生了什么时,它肯定会造成一些精神混乱。
[Project Name]在“解决方案资源管理器”中的> Dependencies>下Analyzers,有一堆警告会传播到使用该库的任何项目的同一部分。这也会造成精神混乱。幸运的是,您可以通过执行以下操作来关闭它们:A。右键单击该项目并选择Properties。b. 在 下Code Analysis,取消选中Run on Build和Run on Live Analysis框。
最后一点:我还没有在 Xamarin 项目中使用以这种方式设置的 .NET Standard 库进行测试(这是最初让我走这条路的场景),但我将来会这样做并更新当时这个答案。
更新:我现在已在发布的 Xamarin 应用程序中使用了此技术!唯一奇怪的是,您无法复制粘贴 .cshtml 文件来创建新文件。它搞砸了原始文件和副本,您必须编辑项目文件才能修复问题。相反,只需每次按照上述方式手动添加一个新文件即可。
我希望这可以帮助别人。如果有人弄清楚解决方案资源管理器中的奇怪现象是怎么回事,我很想知道!
Ser*_*ega -1
我通常在 ASP.NET 应用程序之外使用 T4 模板:https://msdn.microsoft.com/en-US/library/bb126445.aspx。Visual Studio 有多个插件可以启用代码突出显示,例如http://t4-editor.tangible-engineering.com/T4-Editor-Visual-T4-Editing.html。
当然,T4 并不等同于 Razor,你应该学习语法才能使用它,但我认为在 webapp 之外使用 Razor 是不好的风格......
使用 T4,您可以从模板创建您自己的具有自定义强类型属性和构造函数的类,这比 Razor 的功能要强大得多。