【问题标题】:What is the best way to use Razor in a console application在控制台应用程序中使用 Razor 的最佳方式是什么
【发布时间】:2018-10-09 08:24:08
【问题描述】:

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

我想在控制台应用程序或类库中使用 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 个月大的答案:stackoverflow.com/a/47756437/403671 这是纯粹的剃须刀,没有任何 ASP.NET 或 MVC 依赖项。请注意,.cshtml 文件不是“razor”文件,它们是 ASP.NET MVC,因此您不会在 razor 控制台应用程序中拥有它(除非您以某种方式模拟它)。
  • @SimonMourier 感谢您的回复。这真是太棒了!一个缺点是,这个想法似乎是将文件作为没有编辑器支持的文本来处理。有没有办法在 Visual Studio 中获得一些基本的设计时支持,以便它能够识别 Razor 块和 HTML,例如?
  • 这个我不知道,也没有调查过。
  • 您可以简单地使用run-time t4 templates。您可以下载/克隆一个工作示例here

标签: c# razor console-application


【解决方案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 的能力。

【讨论】:

  • 感谢您的回复。我想使用 Razor,因为我想重用/重新利用为网站开发的模板。不过,我也会看看 T4。
  • 不回答问题。
【解决方案2】:

只需使用RazorEngine 库。

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

【讨论】:

    【解决方案3】:

    您可以通过添加 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 访问剃刀代码中的参数。

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

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

    【讨论】:

      【解决方案4】:

      自从我近两年前提出这个问题以来,我一直在零星研究这个问题,我相信我有一个 99% 不笨拙的解决方案。 以下所有内容在 Visual 中都适用于我工作室 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 文件的后代:

      一个。在我认为正确的方式中,.cshtml 文件将生成的.cs 文件作为其唯一的后代。该文件又具有两个生成的类,YourRazorClassYourRazorClassBase。每一个都可以扩展以显示类成员,它们具有漂亮的、人类可读的名称。

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

      这似乎在解决方案资源管理器中出现和消失,我认为它不会造成任何伤害,但当您想知道到底发生了什么时,它肯定会导致一些精神混乱。

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

      一个。右键单击该项目并选择Properties。 湾。在Code Analysis 下,取消选中Run on BuildRun on Live Analysis 框。

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

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

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

      【讨论】:

      • 既然有这么多更复杂的方法,为什么要这样做呢? (开玩笑)。令人难以置信的是,这在其他地方的记录如此之少。感谢发帖。
      • 这肯定落入了“我是不是在吃疯药?”对我来说类别。我只是不明白为什么做 Razor 的自然应用如此困难。仍然希望微软在未来的 Visual Studio 更新中支持这一点。
      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-21
        • 2010-09-07
        • 2012-12-23
        • 1970-01-01
        • 2012-02-22
        • 1970-01-01
        • 2012-03-06
        相关资源
        最近更新 更多