如何在RazorEngine模板中使用CSS /更少样式

时间:2019-02-06 09:28:04

标签: c# css less razorengine

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

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

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

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

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

任何人都可以解释一下,该怎么做,如果它不能像我实际需要的那样工作,请以其他方式解释为什么以及如何做?

2 个答案:

答案 0 :(得分:0)

好吧,因为没人能回答,所以我使用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

答案 1 :(得分:0)

签出this answer作为基本模板。至此,您可以创建如下的帮助器类。由于Scripts是静态类,因此不能创建它们,因为它们不能像TemplateBaseHtmlHelper类那样的属性添加到您的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 class来导入System.Web.Optimization命名空间,但是我无法使其正常工作。