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

2023-12-24

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

我想在控制台应用程序或类库中使用 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。
  • 说找不到各种类型的类型或者命名空间。
  • 对于从其他库导入的类型来说,上述情况尤其如此。
  • The @model无法识别关键字。
  • 智能感知有时有效,有时无效。

奇怪的是,如果您忽略所有这些错误,HTML 实际上会正确生成,包括使用 Razor 引擎抱怨的库和 @model 关键字。然而,这会导致严重的精神混乱,因为如果您有任意数量的 .cshtml 文件,您很快就会遇到成百上千个与实际错误混合在一起的错误。

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


自从我近两年前提出这个问题以来,我一直在零星地研究这个问题,我相信我有一个 99% 不笨重的解决方案。下面的一切都适合我视觉工作室16.4.5.

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

  1. 如果在 .NET Core 控制台应用程序中创建和使用 Razor 文件,一切似乎都可以轻松完成。
  2. 您还可以将 Razor 文件放入 .NET Standard 库中,并从 .NET Core 控制台应用程序使用它们,尽管在这种情况下,解决方案资源管理器中存在一些小问题。不过,我认为它对功能没有任何影响。
  3. 无论哪种方式,两者@model@using关键字工作正常,智能感知工作正常,lambda 表达式工作正常,一切似乎都工作正常。

这是你必须做的:

添加 Razor 文件:

添加一个新的 HTML 文件,但用.cshtml扩大。

在解决方案资源管理器中选择该文件。在“属性”窗口的“自定义工具”下,输入RazorTemplatePreprocessor. A .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 标准库中的 Razor 文件时才会出现:

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

A。以我认为正确的方式,.cshtml文件的唯一后代是生成的.cs文件。该文件又具有两个生成的类,YourRazorClass and YourRazorClassBase。其中每一个都可以扩展以显示类成员,这些成员具有漂亮的、人类可读的名称。

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

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

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

A。右键单击该项目并选择Properties。 b.在下面Code Analysis,取消选中Run on Build and Run on Live Analysis boxes.

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

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

我希望这可以帮助别人。如果有人弄清楚解决方案资源管理器中的奇怪现象是怎么回事,我很想知道!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在控制台应用程序中使用 Razor 的最佳方式是什么 的相关文章

随机推荐

  • 使 JButton 表现得像 JMenu

    我有以下 JMenuBar 代码 此代码取自免费的 java 程序调用JGuiD https sourceforge net projects jguid 并出于个人目的进行编辑 import javax swing import java
  • 在 Visual Studio 2015 Community RTM 中为 ASP.NET 5 项目启用 SSL

    Most tutorials suggest that you can enable SSL for the website by going to properties of the project and then ticking th
  • ObjectAnimator 像素化 TextView

    我在 Samsung GT N5110 android 版本 4 1 2 中放大 TextViews 和 Checkboxes 时遇到问题 放大 TextView 后出现下图 里面有 textview 我想放大它我确实尝试在开发人员选项中启
  • Haskell Prelude.read:无法解析字符串

    来自哈斯克尔的例子http learnyouahaskell com types and typeclasses http learnyouahaskell com types and typeclasses ghci gt read 5
  • 如何获取Azure ResourceManagementClient对象的标签

    我正在尝试使用 ResourceManagementClient 类获取资源组的标签列表 Microsoft Azure Management Resources 2 14 1 预览版 添加自包管理器控制台 ResourceManageme
  • 如何在 MongoDB shell 中将 NumberLong 转换为 Date?

    我将 unix 时间戳存储为 MongoDB 的NumberLongtype 毫秒 如何在 Mongo shell 中转换为人类可读的日期字符串 供我自己将来参考 并结合其他答案 db mycollection aggregate matc
  • 如何横向显示 AutoCompleteTextView 建议

    AutoCompleteTextView 在纵向模式的下拉列表中显示建议 我想在对话框或横向模式的下拉列表中显示建议 这里 EditText 和键盘全屏显示 我应该在适配器中使用哪种布局才能在横向模式下将提示显示为对话框 我目前正在使用an
  • 如何从 Web 应用程序中找出 ASP.NET 中的会话大小?

    如何从 Web 应用程序中找出 ASP NET 中的会话大小 如果您尝试在运行时而不是在调试跟踪中获取会话的大小 您可能需要尝试如下操作 long totalSessionBytes 0 BinaryFormatter b new Bina
  • 在 matplotlib 中设置图例中标签部分的样式

    是否可以有part特定风格的传说文本 比方说 bold or italic 写在之间 强制 matplotlib 解释它 import matplotlib pyplot as plt plt plot range 10 range 10
  • 如何仅循环批处理脚本一定的次数?

    如何仅循环批处理脚本一定次数 x10 或其他 如果代码是 echo off loop1 Start taskmgr exe Goto loop loop2
  • HttpRuntime.Cache.Add 中的值为 Null

    我想为其中的一些键存储 nullHttpRuntime Cache因为我不想再次进入数据库发现没有该密钥的条目 所以第一次 它会进入数据库并填充缓存 目的是使用缓存数据来服务以下调用 而不是执行数据库调用 这是我正在使用的代码 Info i
  • 在javascript中访问ruby数组

    我想在 javascript 中访问 Ruby 数组 请告诉我这样做的方法 我的数组保存了 sql 查询的结果 contacts Contact order contacts position ASC 我正在尝试这样做 for var i
  • 导入 F2Py 模块时如何“捕获”段错误?

    一些背景 其相关性可能会波动 我目前拥有一些 F2Py 库 F2Py 从一些 Fortran 代码编译的 Python 模块 出于所有意图和目的 您可以将这些模块视为 第三方 我目前无法访问 Fortran 源代码 并且我不负责编译过程 这
  • 如何将 shell 变量导出到所有会话?

    我想知道有没有办法将我的 shell 变量导出到系统中的所有会话 不仅仅是当前会话 我不想在 bashrc 文件中设置它 因为 shell 变量是动态变量 它会不时更改 您可以通过在调试中设置陷阱来设置会话以继续重新读取磁盘上的文件 bas
  • 如何在 ASP.NET 项目中设置无限会话超时?

    我正在开发一个 ASP NET 项目 如何增加会话超时 无限超时 或者我应该在 IIS 上执行此操作 如果可以的话请解释一下 您可以设置session timeout in web config如下所示 该值显示分钟 因此您可以根据需要设置
  • CSS 中报告部分样式列表编号?

    现在我了解了 正常 CSS 列表样式 罗马 拉丁等 当然在过去的几年里 它们在不允许诸如以下内容方面有些不灵活 a or a only a 现在我相信你可以通过 before 和 after 伪元素得到像上面这样的效果 那是对的吗 如果可以
  • 如何填充seaborn分布图中曲线下的面积

    我有两个变量 x 1 883830 7 692308 8 791209 9 262166 y 5 337520 4 866562 2 825746 6 122449 我想使用 matplotlib 包装的 seaborn 来拟合高斯分布 似
  • 如何打破多个 foreach 循环? [复制]

    这个问题在这里已经有答案了 我有四个 foreach 循环 它们遍历集合并根据条件执行某些操作 这是我现在正在编写的代码 boolean breakFlag false String valueFromObj2 null String va
  • iOS 自动布局:两个并排的宽度相等的按钮

    我目前在自动布局方面遇到困难 我正在使用界面生成器 并尝试并排放置两个宽度相等的按钮 如下图所示 从下面的预览图像中 我的 titleImage 已被正确约束并正确显示 但按钮却不然 我尝试将按钮 1 与 titleImage 的前缘对齐
  • 在控制台应用程序中使用 Razor 的最佳方式是什么

    我知道以前也有人问过类似的问题 但唯一的答案是六年前的 而且人们提到的项目似乎没有得到维护 我想在控制台应用程序或类库中使用 Razor 来渲染 HTML 我还想在 cshtml 文件中使用智能感知 目前 我可以通过执行以下操作来临时操纵此