在控制台应用程序中使用Razor的最佳方法是什么

时间:2018-04-28 19:16:50

标签: c# razor console-application

我之前已经问过类似的问题,但唯一的答案是六年了,人们提到的项目看起来似乎没有被维护。

我想在控制台应用程序或类库中使用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网络应用程序中工作吗?

5 个答案:

答案 0 :(得分:3)

自从我两年前问这个问题以来,我一直在零星地工作,我相信我有99%的笨拙解决方案。 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)的直接后代出现,并且其类成员也有所不同。

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

  2. 在解决方案资源管理器的[Project Name]> Dependencies> Analyzers下,有许多警告传播到使用该项目的任何项目的同一部分。图书馆。这也会造成精神混乱。幸运的是,您可以通过执行以下操作将其关闭:

    a。右键单击该项目,然后选择Properties。 b。在Code Analysis下,取消选中Run on BuildRun on Live Analysis框。

最后一点:我尚未在Xamarin项目中使用以这种方式设置的.NET标准库进行测试(这是本来让我走这条路的场景),但是我将在未来与更新 当时的答案。

我希望这对某人有帮助。如果有人知道解决方案资源管理器中的异常情况,我很想知道!

答案 1 :(得分:1)

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

Microsoft.CodeDom.Providers.DotNetCompilerPlatform

这将为您提供var关键字。

此外,您可以通过以下操作获得模板参数的智能提示

  1. 创建一个新的.cs文件
  2. 在其中添加一个与.cshtml文件自动生成的部分类同名的部分类。像这样的东西:

public partial class htmlRazor : htmlRazorBase { public DateTime myDate}

  1. 向此部分类添加一个构造函数,该构造函数将使用一些输入参数:

public htmlRazor(DateTime _mydate) {myDate = _mydate}

  1. 在.cshtml文件顶部添加以下行:

@using yourNameSpace @*Make sure the parameter below have exactly the same name as the variable inside the partial class (public DateTime myDate). This line will be full of errors, but you can safely ignore them.*@ @{htmlRazor agrs = new htmlRazor(myDate);}

例如,您现在可以执行agrs.myDate来访问剃刀代码中的参数。

最后一点,我的剃刀项目实际上是一个类库(创建一个.dll文件)。我从第二个控制台应用程序项目中引用了该库。 然后,我从这样的模板创建html:

htmlRazor html = new htmlRazor(DateTime.Now); string htmlTxt = html.GenerateString();

答案 2 :(得分:0)

我通常在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更多。

答案 3 :(得分:0)

只需使用RazorEngine 库。

根据文档支持

cshtml文件intellisense。

答案 4 :(得分:0)

最好的方法是“RazorLight”https://github.com/toddams/RazorLight 简单明了