1

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

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

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

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

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

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

4

2 回答 2

1

查看基本模板的这个答案。从这一点开始,您可以创建如下所示的辅助类。这些是创建所必需的,因为Scripts它是一个静态类,不能像和类TemplateBase一样作为属性添加到您的。HtmlHelperViewDataDictionary

    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 命名空间,但我无法让它正常工作。

于 2019-07-17T18:14:04.150 回答
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
于 2019-04-08T12:28:07.017 回答