如何在 RazorEngine 模板中使用 css/less 样式
How to use css/less styles in RazorEngine template
我想使用 Antaris RazorEngine 生成大量不同的邮件。
是否有可能将脚本和样式包包含到布局中?
我们一起动态构建这些包,因此它们包含许多不同的 .css/.js 文件。
在我们的非电子邮件布局中,我们总是这样包含它们:
@Styles.Render("~/bundles/" + theme + "/styles")
@Scripts.Render("~/bundles/scripts")
@RenderSection("scripts", false)
我不想使用内联样式,因为这会极大地拉伸每个视图并且难以维护。
我试图 google 这个问题,但我还没有找到我要搜索的内容。
谁能解释一下,如何做到这一点,如果它不能像我真正需要的那样工作,请解释为什么以及如何以其他方式做到这一点?
好吧,由于没有人能回答,我使用 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
查看 this answer 基本模板。从这一点开始,您可以像下面这样创建助手 classes。这些是创建所必需的,因为 Scripts
是静态的 class,不能像 HtmlHelper
和 ViewDataDictionary
那样作为 属性 添加到您的 TemplateBase
class可以。
public class ScriptsHelper
{
public IHtmlString Render(params string[] scripts)
{
return Styles.Render(scripts);
}
}
然后您可以将这些助手 class 添加到您的 HtmlTemplateBase<T>
class 作为 public 属性
[RequireNamespaces("System.Web.Mvc.Html")]
public class HtmlTemplateBase<T>:TemplateBase<T>, IViewDataContainer
{
public ScriptsHelper Scripts = new ScriptsHelper();
//... Additional Code
}
您的 RazorEngine 视图现在可以访问您添加到助手中的功能 class。因此,您间接调用了所需的函数,并且可以像使用普通 classes.
一样调用它们
// This will actually be calling ScriptsHelper.Scripts(), which then calls the static function
@Scripts.Render("~/scripts/scripturl")
这些问题的解决方案有些老套。您需要使用每个需要的 Scripts
函数来扩展 ScriptsHelper
class。您的 Styles
class 也可以执行相同的过程。
您也许可以利用 Reference Resolver class 导入 System.Web.Optimization 命名空间,但我无法使其正常工作。
我想使用 Antaris RazorEngine 生成大量不同的邮件。 是否有可能将脚本和样式包包含到布局中? 我们一起动态构建这些包,因此它们包含许多不同的 .css/.js 文件。
在我们的非电子邮件布局中,我们总是这样包含它们:
@Styles.Render("~/bundles/" + theme + "/styles")
@Scripts.Render("~/bundles/scripts")
@RenderSection("scripts", false)
我不想使用内联样式,因为这会极大地拉伸每个视图并且难以维护。
我试图 google 这个问题,但我还没有找到我要搜索的内容。
谁能解释一下,如何做到这一点,如果它不能像我真正需要的那样工作,请解释为什么以及如何以其他方式做到这一点?
好吧,由于没有人能回答,我使用 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
查看 this answer 基本模板。从这一点开始,您可以像下面这样创建助手 classes。这些是创建所必需的,因为 Scripts
是静态的 class,不能像 HtmlHelper
和 ViewDataDictionary
那样作为 属性 添加到您的 TemplateBase
class可以。
public class ScriptsHelper
{
public IHtmlString Render(params string[] scripts)
{
return Styles.Render(scripts);
}
}
然后您可以将这些助手 class 添加到您的 HtmlTemplateBase<T>
class 作为 public 属性
[RequireNamespaces("System.Web.Mvc.Html")]
public class HtmlTemplateBase<T>:TemplateBase<T>, IViewDataContainer
{
public ScriptsHelper Scripts = new ScriptsHelper();
//... Additional Code
}
您的 RazorEngine 视图现在可以访问您添加到助手中的功能 class。因此,您间接调用了所需的函数,并且可以像使用普通 classes.
一样调用它们// This will actually be calling ScriptsHelper.Scripts(), which then calls the static function
@Scripts.Render("~/scripts/scripturl")
这些问题的解决方案有些老套。您需要使用每个需要的 Scripts
函数来扩展 ScriptsHelper
class。您的 Styles
class 也可以执行相同的过程。
您也许可以利用 Reference Resolver class 导入 System.Web.Optimization 命名空间,但我无法使其正常工作。