问题描述
我知道以前也有人问过类似的问题,但唯一的答案是六年前的,而且人们提到的项目似乎没有得到维护。
我想在控制台应用程序或类库中使用Razor来呈现HTML。我还希望在.cshtml文件中使用智能感知。
目前,我可以通过执行以下操作对此进行临时调整:
- 创建控制台应用。
- 添加.cshtml文件。
- 在"属性"中,将
Custom Tool
属性设置为RazorTemplatePreprocessor
这会导致识别Razor语法。因此,如果您有Test.cshtml
,它会生成一个名为Test
的类,您可以这样使用:
var test = new Test();
test.Model = "Hi there";
var html = test.GenerateString();
Console.WriteLine(html);
对于我的目的来说,这差不多足够了。但是,.cshtml文件中的实际编码体验非常糟糕:
- 到处都是红色的曲线在抱怨:
- 无法使用
var
,因为它是C#2。 - 说找不到各种类型的类型或命名空间。
- 从其他库导入的类型尤其如此。
- 无法识别
@model
关键字。 - 智能感知有时起作用,有时不起作用。
我可以做些什么来使实际的Razor编码体验更像在ASP.NET Web应用中那样工作?
推荐答案
自从我在近两年前提出这个问题以来,我一直在零星地研究这个问题,我相信我有一个99%.的解决方案。下面的所有内容都适用于Visual Studio16.4.5。
以下是我了解到的有关让Razor在控制台和库项目中工作的知识。
- 如果在.NET Core控制台应用中创建和使用您的Razor文件,则似乎可以轻松地完成所有工作。
- 您还可以将Razor文件放在.NET标准库中,然后从.NET核心控制台应用程序使用它们,尽管在这种情况下解决方案资源管理器中有一些小问题。但是,我不认为它对功能有任何影响。
- 无论哪种方式,
@model
和@using
关键字都能正常工作,智能感知能正常工作,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);
解决错误列表中的错误(顺便说一下,这似乎不会影响功能,但肯定会造成思维混乱):
将NuGet引用添加到:
Microsoft.AspNetCore.Mvc.Core
Microsoft.AspNetCore.Mvc.Razor
如果将Razor文件添加到.NET标准库,则会出现一系列以下错误:
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
文件的子体:
.cshtml
文件将生成的.cs
文件作为其唯一的后代。该文件又有两个生成的类,YourRazorClass
和YourRazorClassBase
。其中的每一个都可以展开以显示类成员,这些成员具有易于阅读的美观名称。
b.但是,有时带下划线前缀的类显示为.cshtml
文件(例如,_MyTestRazorClass
)的直系后代,而且其类成员也不同。
这似乎会从解决方案资源管理器中出现和消失,我认为它不会造成任何伤害,但当您想知道到底是怎么回事时,它肯定会引起一些头脑混乱。
- 在解决方案资源管理器中的
[Project Name]
>;Dependencies
>;Analyzers
下,有一组警告向上传播到使用库的任何项目的同一部分。这也会造成精神上的混乱。幸运的是,您可以通过执行以下操作将其关闭:
Properties
。
b.在Code Analysis
下,取消选中Run on Build
和Run on Live Analysis
复选框。
最后一点注意:我还没有在Xamarin项目中使用以这种方式设置的.NET标准库进行测试(这是最初让我沿着这条路走下去的场景),但我会在将来这样做并更新
这是当时的答案。
更新:我现在已经在发布的Xamarin应用程序中使用了此技术!唯一奇怪的是,您无法复制粘贴.cshtml文件来创建新文件。它把原始文件和副本都搞砸了,您必须去编辑项目文件来修复问题。相反,每次只需如上所述手动添加一个新文件即可。
我希望这对某人有帮助。如果有人知道解决方案资源管理器中的怪异是怎么回事,我很想知道!
这篇关于在控制台应用程序中使用Razor的最佳方式是什么的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!