.NET,C#:RazorEngine,从项目文件夹中解析模板 CsHtml 文件
.NET, C#: RazorEngine, Parse Template CsHtml file from inside project folder
我有以下项目结构:
Solution
Project
Properties/
References/
Model/
Message.cs
Views/
Index.cshtml
EmailBuilder/
EmailBuilder.cs
Program.cs
我想从 Index.cshtml 文件中读取所有文本并将我的模型传递给该文件。但是,如果不设置 Copy to Output Directory: Copy if newer
,我无法从我的代码中打开 Index.cshtml。我不想将这些文件复制到输出目录,因为我不想让生成电子邮件的用户看到模板文件。这就是我目前正在做的事情:
private static readonly string TemplateFolderPath =
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Views");
RazorEngineManager.Instance.Razor.AddTemplate("Index",
File.ReadAllText(Path.Combine(TemplateFolderPath, "Index.cshtml")));
如何在不将 cshtml 文件复制到输出目录的情况下读取它?我来自 Java 世界,它就像从类路径解析文本或速度文件一样简单,不需要将文件复制到输出目录。这些文件保留在我的 jar 中。
我如何在 .NET 中执行此操作?
请帮忙。
.NET 中的一个类似技术(我犹豫要不要说 "equivalent" 因为我对 Java 的了解还不够确定)是使用嵌入式资源。将 .cshtml 文件的构建操作设置为嵌入式资源,并使用 Assembly.GetManifestResourceStream
打开包含资源内容的流。
string resourceName = typeof(Program).FullName + ".Views.Index.cshtml";
using (Stream resourceStream = typeof(Program).Assembly.GetManifestResourceStream(resourceName))
{
// Read the contents
}
这假定程序 class 的命名空间是程序集的默认命名空间。通常情况下会出现这种情况,但如果您在项目创建后重命名了一些东西,它可能会不同步,因此请注意这一点。此外,如果找不到资源,流将是 null
,因此请务必检查一下。
您还可以使用 Assembly.GetManifestResourceNames
枚举模板。
string prefix = typeof(Program).FullName + ".Views.";
var templates = (from rn in typeof(Program).Assembly.GetManifestResourceNames()
where rn.EndsWith(".cshtml")
select new TemplateInfo
{
Key = Path.GetFileName(rn)
FileName = rn.Substring(prefix.Length)
ResourceName = rn
}).ToList();
现在您有了对象列表(您自己定义 TemplateInfo
),其中包含资源名称、文件名和可在模板管理器中使用的密钥。
这项技术有一个缺点:当您添加新的 CSHTML 文件时,您必须记得将其更改为 Embedded Resource。提示:如果您 copy/paste Visual Studio 内的文件,它会将构建操作 属性 复制到新文件。
我有以下项目结构:
Solution
Project
Properties/
References/
Model/
Message.cs
Views/
Index.cshtml
EmailBuilder/
EmailBuilder.cs
Program.cs
我想从 Index.cshtml 文件中读取所有文本并将我的模型传递给该文件。但是,如果不设置 Copy to Output Directory: Copy if newer
,我无法从我的代码中打开 Index.cshtml。我不想将这些文件复制到输出目录,因为我不想让生成电子邮件的用户看到模板文件。这就是我目前正在做的事情:
private static readonly string TemplateFolderPath =
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Views");
RazorEngineManager.Instance.Razor.AddTemplate("Index",
File.ReadAllText(Path.Combine(TemplateFolderPath, "Index.cshtml")));
如何在不将 cshtml 文件复制到输出目录的情况下读取它?我来自 Java 世界,它就像从类路径解析文本或速度文件一样简单,不需要将文件复制到输出目录。这些文件保留在我的 jar 中。
我如何在 .NET 中执行此操作?
请帮忙。
.NET 中的一个类似技术(我犹豫要不要说 "equivalent" 因为我对 Java 的了解还不够确定)是使用嵌入式资源。将 .cshtml 文件的构建操作设置为嵌入式资源,并使用 Assembly.GetManifestResourceStream
打开包含资源内容的流。
string resourceName = typeof(Program).FullName + ".Views.Index.cshtml";
using (Stream resourceStream = typeof(Program).Assembly.GetManifestResourceStream(resourceName))
{
// Read the contents
}
这假定程序 class 的命名空间是程序集的默认命名空间。通常情况下会出现这种情况,但如果您在项目创建后重命名了一些东西,它可能会不同步,因此请注意这一点。此外,如果找不到资源,流将是 null
,因此请务必检查一下。
您还可以使用 Assembly.GetManifestResourceNames
枚举模板。
string prefix = typeof(Program).FullName + ".Views.";
var templates = (from rn in typeof(Program).Assembly.GetManifestResourceNames()
where rn.EndsWith(".cshtml")
select new TemplateInfo
{
Key = Path.GetFileName(rn)
FileName = rn.Substring(prefix.Length)
ResourceName = rn
}).ToList();
现在您有了对象列表(您自己定义 TemplateInfo
),其中包含资源名称、文件名和可在模板管理器中使用的密钥。
这项技术有一个缺点:当您添加新的 CSHTML 文件时,您必须记得将其更改为 Embedded Resource。提示:如果您 copy/paste Visual Studio 内的文件,它会将构建操作 属性 复制到新文件。