在控制台应用程序中使用Razor的最佳方式是什么 [英] What is the best way to use Razor in a console application

查看:51
本文介绍了在控制台应用程序中使用Razor的最佳方式是什么的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

我想在控制台应用程序或类库中使用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关键字。
  • 智能感知有时起作用,有时不起作用。
奇怪的是,如果忽略所有这些错误,HTML实际上是正确生成的,包括Razor引擎抱怨的库和@model关键字的使用。但是,这会造成很大的心理混乱,因为如果您有任意数量的.cshtml文件,您很快就会陷入成百上千个这样的错误和真正的错误。

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

推荐答案

自从我在近两年前提出这个问题以来,我一直在零星地研究这个问题,我相信我有一个99%.的解决方案。下面的所有内容都适用于Visual Studio16.4.5

以下是我了解到的有关让Razor在控制台和库项目中工作的知识。

  1. 如果在.NET Core控制台应用中创建和使用您的Razor文件,则似乎可以轻松地完成所有工作。
  2. 您还可以将Razor文件放在.NET标准库中,然后从.NET核心控制台应用程序使用它们,尽管在这种情况下解决方案资源管理器中有一些小问题。但是,我不认为它对功能有任何影响。
  3. 无论哪种方式,@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文件时才会出现:

  1. 解决方案资源管理器有时会以两种不同的方式显示.cshtml文件的子体:
a.以我认为正确的方式,.cshtml文件将生成的.cs文件作为其唯一的后代。该文件又有两个生成的类,YourRazorClassYourRazorClassBase。其中的每一个都可以展开以显示类成员,这些成员具有易于阅读的美观名称。

b.但是,有时带下划线前缀的类显示为.cshtml文件(例如,_MyTestRazorClass)的直系后代,而且其类成员也不同。

这似乎会从解决方案资源管理器中出现和消失,我认为它不会造成任何伤害,但当您想知道到底是怎么回事时,它肯定会引起一些头脑混乱。

  1. 在解决方案资源管理器中的[Project Name]>;Dependencies>;Analyzers下,有一组警告向上传播到使用库的任何项目的同一部分。这也会造成精神上的混乱。幸运的是,您可以通过执行以下操作将其关闭:
a.右键单击项目并选择Properties。 b.在Code Analysis下,取消选中Run on BuildRun on Live Analysis复选框。

最后一点注意:我还没有在Xamarin项目中使用以这种方式设置的.NET标准库进行测试(这是最初让我沿着这条路走下去的场景),但我会在将来这样做并更新 这是当时的答案。

更新:我现在已经在发布的Xamarin应用程序中使用了此技术!唯一奇怪的是,您无法复制粘贴.cshtml文件来创建新文件。它把原始文件和副本都搞砸了,您必须去编辑项目文件来修复问题。相反,每次只需如上所述手动添加一个新文件即可。

我希望这对某人有帮助。如果有人知道解决方案资源管理器中的怪异是怎么回事,我很想知道!

这篇关于在控制台应用程序中使用Razor的最佳方式是什么的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆