【问题标题】:.NET, C#: RazorEngine, Parse Template CsHtml file from inside project folder.NET,C#:RazorEngine,从项目文件夹中解析模板 CsHtml 文件
【发布时间】:2018-12-04 21:33:00
【问题描述】:

我的项目结构如下:

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 中执行此操作?

请帮忙。

【问题讨论】:

    标签: c# templating razorengine


    【解决方案1】:

    .NET 中的一种类似技术(我不敢说“等效”,因为我对 Java 的了解不够充分,无法确定)是使用嵌入式资源。将 .cshtml 文件的 Build Action 设置为 Embedded 资源,并使用 Assembly.GetManifestResourceStream 打开包含资源内容的流。

    string resourceName = typeof(Program).FullName + ".Views.Index.cshtml";
    using (Stream resourceStream = typeof(Program).Assembly.GetManifestResourceStream(resourceName))
    {
        // Read the contents
    }
    

    这假定 Program 类的命名空间是程序集的默认命名空间。通常情况下会出现这种情况,但如果您在创建项目后重命名了一些东西,它可能会不同步,因此请注意这一点。此外,如果找不到资源,则流将为 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。提示:如果您在 Visual Studio 中复制/粘贴文件,它会将 Build Action 属性复制到新文件中。

    【讨论】:

    • 这很好用,谢谢!我花了很多时间试图弄清楚这一点,我终于知道了 .NET 方式:)
    猜你喜欢
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多