如何在控制台应用程序中最佳地使用Razor?

19

我知道类似的问题之前已经被问过,但唯一的答案都是六年前的了,而且人们提到的项目似乎都没有得到维护。

我想在控制台应用程序或类库中使用Razor来渲染HTML,同时也希望在.cshtml文件中有工作中的Intellisense。

目前,我能够通过以下方式来实现:

  • 创建控制台应用程序。
  • 添加.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 关键字。
  • Intellisense 有时有效,有时无效。

奇怪的是,如果您只忽略所有这些错误,HTML 实际上会被正确生成,包括 Razor 引擎抱怨的库和 @model 关键字的使用。但是,这会导致严重的心理混乱,因为如果您有任意数量的 .cshtml 文件,很快就会混合出现成百上千个这些错误和真正的错误。

我能做些什么来使实际的 Razor 编码体验更像在 ASP.NET Web 应用程序中那样工作吗?


请查看我6个月前的答案:https://dev59.com/wloT5IYBdhLWcg3wtRUR#47756437,它是纯粹的Razor,没有任何ASP.NET或MVC依赖。请注意,.cshtml文件不是“Razor”,它们是ASP.NET MVC,因此您在Razor控制台应用程序中不会有这个(除非您以某种方式模拟它)。 - Simon Mourier
@SimonMourier 感谢您的回复。这真的很棒!唯一的缺点是似乎想法是将文件作为纯文本处理,没有编辑器支持。是否有任何方法可以在Visual Studio中获得一些基本的设计时支持,以便它能够识别Razor块和HTML,例如? - Brian Rak
我不知道,也没有进行调查。 - Simon Mourier
你可以简单地使用运行时t4模板。你可以在这里下载/克隆一个工作示例。 - Reza Aghaei
5个回答

5

自从我两年前提出这个问题以来,我一直零散地在研究,现在我相信我已经有了一个99%的非臃肿解决方案。 下面的所有内容都在我的Visual Studio 16.4.5中运行良好。

以下是我关于如何让Razor在控制台和库项目中工作的经验总结。

  1. 如果您在.NET Core控制台应用程序中创建和使用Razor文件,则似乎不会出现任何问题。
  2. 您还可以将Razor文件放在.NET Standard库中,并从.NET Core控制台应用程序中使用它们,尽管在这种情况下,解决方案资源管理器中存在一些微小的丑陋。但我认为这对功能没有任何影响。
  3. 无论哪种方式,@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);

为了解决错误列表中的错误(顺便提一句,这些错误似乎并不影响功能,但肯定会造成心理干扰):
请添加以下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 Standard库的Razor文件时才会出现这些问题:

  1. 解决方案资源管理器有时以两种不同的方式显示.cshtml文件的后代:

a. 在我认为是正确的方式下,.cshtml文件只有一个生成的.cs文件作为其后代。该文件又有两个生成的类YourRazorClassYourRazorClassBase。每个类成员都可以展开以显示其具有易读名称的类成员。

b. 但是,有时会出现一个下划线前缀的类作为.cshtml文件的直接后代(例如_MyTestRazorClass),它的类成员也不同。

这似乎会在解决方案资源管理器中出现和消失,并且我认为它不会造成任何损害,但是它肯定会在你思考到底发生了什么时造成一些精神混乱。

  1. 在解决方案资源管理器中,在[项目名称]>依赖项>分析器下,有一堆警告会传播到消费该库的任何项目的同一部分。这也会造成精神混乱。幸运的是,您可以通过执行以下操作关闭它们:

a.右键单击项目,选择属性。 b.在代码分析下,取消选中构建时运行实时分析时运行框。

最后一个注意事项:我尚未测试过在Xamarin项目中以此方式设置的.NET Standard库(这是让我开始这个过程的场景),但我将来会进行测试并在那时更新此答案。

更新: 我现在已经在发布的Xamarin应用程序中使用了这个技术!唯一的怪事是你不能复制. cshtml文件来创建一个新的。它会破坏原始文件和副本,你必须编辑项目文件来修复问题。相反,每次都像上面描述的手动添加一个新文件。

我希望这可以帮助到某些人。如果有人发现了解决方案资源管理器中的奇怪问题,请告诉我!


1
为什么要这样做,当有更多复杂的方法可供选择呢?(开玩笑)。令人难以置信的是,其他地方对此的文档记录如此之少。感谢您的发布。 - Ken
这绝对是让我感到困惑的事情。我就是不明白为什么使用Razor似乎如此自然的应用会变得如此困难。我仍然希望微软能在未来的Visual Studio更新中支持这一点。 - Brian Rak

3

只需使用RazorEngine库。

根据文档,支持cshtml文件智能感知。


2

1

您可以通过添加NuGet软件包来升级到C#4:

Microsoft.CodeDom.Providers.DotNetCompilerPlatform

这将给你var关键字。
此外,您可以通过以下方式获得模板参数的智能感知:
1. 创建一个新的.cs文件 2. 在其中添加与.cshtml文件自动生成的名称相同的部分类。类似于以下内容: public partial class htmlRazor:htmlRazorBase { public DateTime myDate} 3. 为这个部分类添加一个构造函数,它将使用一些输入参数: public htmlRazor(DateTime _mydate) {myDate = _mydate} 4. 在您的.cshtml文件顶部添加以下行: @using yourNameSpace @*确保下面的参数与部分类内的变量(public DateTime myDate)完全相同。这一行将充满错误,但您可以安全地忽略它们。*@ @{htmlRazor agrs = new htmlRazor(myDate);} 现在,您可以通过agrs.myDate访问razor代码中的参数。
作为最后的说明,我的剃须刀项目实际上是一个类库(创建了一个.dll文件)。我从第二个控制台应用程序项目引用了这个库。 然后我像这样从模板创建html:
htmlRazor html = new htmlRazor(DateTime.Now); string htmlTxt = html.GenerateString();

-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,您需要学习语法才能使用它,但我认为在Web应用程序之外使用Razor是不好的风格...

使用T4,您可以从模板创建自己的类,具有自定义强类型属性和构造函数,这比Razor更强大。


1
谢谢您的回复。我想使用Razor,因为我想重用/重新设计为网站开发的模板。不过,我也会看看T4。 - Brian Rak
1
不回答问题。 - Aldracor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接