【问题标题】:How to use css/less styles in RazorEngine template如何在 RazorEngine 模板中使用 css/less 样式
【发布时间】:2019-02-06 09:28:04
【问题描述】:

我想通过使用 Antaris RazorEngine 生成大量不同的邮件。 是否有可能在布局中包含脚本和样式包? 我们一起动态构建这些包,因此它们包含许多不同的 .css/.js 文件。

在我们的非电子邮件布局中,我们总是这样包含它们:

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

我不想使用内联样式,因为这会极大地拉伸每个视图并且难以维护。

我试图用谷歌搜索这个问题,但我没有找到我要搜索的内容。

谁能解释一下,如何做到这一点,如果它不像我真正需要的那样工作,解释为什么以及如何以其他方式做到这一点?

【问题讨论】:

    标签: c# css less razorengine


    【解决方案1】:

    查看this answer 以获取基本模板。从这一点开始,您可以创建如下所示的辅助类。因为Scripts 是一个静态类,所以这些是必须创建的,不能像HtmlHelperViewDataDictionary 类一样添加到TemplateBase 中。

        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")
    

    这些问题的解决方案有些老套。您需要使用您需要的每个 Scripts 函数来扩展您的 ScriptsHelper 类。您的Styles 类也可以执行相同的过程。

    您也许可以利用 Reference Resolver class 导入 System.Web.Optimization 命名空间,但我无法让它正常工作。

    【讨论】:

      【解决方案2】:

      好吧,由于没有人能回答,我使用 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-25
        • 2014-09-21
        • 1970-01-01
        • 1970-01-01
        • 2014-01-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多