.NET, C #: RazorEngine, файл синтаксического анализа шаблона CsHtml из папки проекта - PullRequest
0 голосов
/ 05 декабря 2018

У меня следующая структура проекта:

Solution
    Project
        Properties/
        References/
        Model/
            Message.cs
        Views/
            Index.cshtml
        EmailBuilder/
            EmailBuilder.cs
        Program.cs

Я хотел бы прочитать весь текст из файла Index.cshtml и передать мои модели в файл.Однако я не могу открыть Index.cshtml из моего кода без установки Copy to Output Directory: Copy if newer.Я не хочу копировать эти файлы в выходной каталог, потому что я не хочу, чтобы пользователь, генерирующий электронные письма, видел файлы шаблона.Вот что я сейчас делаю:

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, и это так же просто, как анализ текста или файла скорости из classpath, который не требует копирования файлов в выходной каталог.Файлы остаются встроенными в мою банку.

Как я могу сделать это в .NET?

Пожалуйста, помогите.

1 Ответ

0 голосов
/ 05 декабря 2018

Подобная техника в .NET (я не решаюсь сказать «эквивалент», потому что я не знаю достаточно хорошо, чтобы быть уверенным в Java) - это использовать встроенные ресурсы.Установите действие сборки для файлов .cshtml на встроенный ресурс и используйте 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 в новый файл.

...