Как использовать стили css / less в шаблоне RazorEngine - PullRequest
0 голосов
/ 06 февраля 2019

Я хотел бы создать большое количество различных писем с помощью Antaris RazorEngine.Есть ли возможность включить в макет наборы скриптов и стилей?Мы собираем эти пакеты динамически вместе, чтобы они включали много разных .css / .js-файлов.

В наших макетах, не относящихся к электронной почте, мы всегда включаем их следующим образом:

@Styles.Render("~/bundles/" + theme + "/styles") 
@Scripts.Render("~/bundles/scripts") 
@RenderSection("scripts", false)

Я не хочу использовать inline-style, так как это чрезвычайно растягивает каждое представление и его трудно поддерживать.

Я пытался найти эту проблему в Google, но не нашел, что искал.

Может ли кто-нибудь объяснить, как это сделать, и если это не работает так, как мне на самом деле нужно, объяснить, почему и как это сделать другим способом?

Ответы [ 2 ]

0 голосов
/ 17 июля 2019

Проверьте этот ответ для базового шаблона.С этого момента вы можете создавать вспомогательные классы, как показано ниже.Это необходимо создать, поскольку Scripts является статическим классом и не может быть добавлен к вашему TemplateBase как свойство, как классы HtmlHelper и ViewDataDictionary.

    public class ScriptsHelper 
    {
       public IHtmlString Render(params string[] scripts) 
       {
          return Styles.Render(scripts);
       }
    }

Затем можно добавитьэти вспомогательные классы для вашего HtmlTemplateBase<T> класса как публичные свойства

    [RequireNamespaces("System.Web.Mvc.Html")]
    public class HtmlTemplateBase<T>:TemplateBase<T>, IViewDataContainer
    {
        public ScriptsHelper Scripts = new ScriptsHelper();

        //... Additional Code 
    }

Теперь ваше представление RazorEngine будет иметь доступ к функциям, добавленным в ваш вспомогательный класс.Таким образом, вы косвенно вызываете нужные вам функции и можете вызывать их так же, как и обычные классы.

// This will actually be calling ScriptsHelper.Scripts(), which then calls the static function
@Scripts.Render("~/scripts/scripturl")

Это несколько хакерские решения проблемы.Вам нужно будет расширить класс ScriptsHelper с помощью каждой функции Scripts, которая вам нужна.Тот же процесс можно выполнить и для вашего Styles класса.

Возможно, вы сможете использовать класс Reference Resolver для импорта пространства имен System.Web.Optimization, но мне не удалось заставить его работать должным образом.

0 голосов
/ 08 апреля 2019

Ну, так как никто не мог ответить на это, я использовал Premailer, чтобы переместить мои файлы .less (или .css, сгенерированный из него) в строку.У меня работает, даже не совсем то, что я хотел.

string viewString = System.IO.File.ReadAllText(viewPath); // view to string
string cssSiteString = System.IO.File.ReadAllText(cssSitePath); // css-file to string

Engine.Razor.AddTemplate(nameoftemplate, viewString);
Engine.Razor.Compile(viewPath);

var result = Engine.Razor.Run(viewPath, null, model, viewBag);

var pm = new PreMailer.Net.PreMailer(result); 
var completeMail = pm.MoveCssInline(css: cssSiteString); // this line moves the css inline
...