首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BundleTransformer.Less注入变量取决于上下文/请求

BundleTransformer.Less注入变量取决于上下文/请求
EN

Stack Overflow用户
提问于 2013-06-05 17:10:53
回答 1查看 1.9K关注 0票数 2

我们希望将System.Web.Optimization的捆绑机制与较少的变压器结合使用。

问题是相同的应用程序/服务器为不同品牌的网站提供页面。因此,根据“SiteContext”使用相同的.less文件,但是.less变量应该使用不同的值。因此,我们希望(Re)使用相同的更少的文件,但是使用不同的变量,这取决于请求的上下文。

我尝试了几种不同的理论:

在所有3种情况下,我根据SiteContext设置了不同的包。

1通过使用拦截variables.less文件的自定义VirtualPathProvider,使用主题变量注入@import指令VirtualPathProvider。

所以我有:

  • 样式文件例如: header.less (导入变量文件)
  • 变量文件: variables.less
  • 主题变量文件:变量-主题。无(通过variables.less通过VirtualPathProvider注入)

这是不起作用的,因为BundleTransformer缓存将其视为相同的文件,并且不了解SiteContext。缓存密钥基于IAsset的Url,我们不能影响这种行为。

2将variables.less导入替换为变量-主题.,它使用运行在较小转换器之前的自定义转换器

同样没有运气,同样的缓存问题。

作为一个副作用,在调试中没有调用额外的转换器,因为资产不是捆绑在一起的,而是由LessAssetHandler单独调用的。这可以通过编写您自己的调用所有所需变压器的AssetHandler来解决。

3创建主题资产名称,由自定义VirtualPathProvider解析。将头-emeX.less添加到包中,此文件不存在,但您可以将该文件解析为header.less,并使用方法2设置正确的变量文件导入。(将variables.less导入主题版本)。

再一次没有运气。我认为,如果不是Bundle.Include(string virtualPath)在内部执行File.Exists(path),那么这可以解决缓存问题。它不会通过CustomVirtualPathProvider

我是想深入解决这个问题吗?所有的想法都是受欢迎的,我可以想象,随着System.Web.Optimization库变得越来越流行,这将成为越来越多的人的问题。

请记住:

  • 我们有很多. .less/css文件
  • 我们将有5个左右的主题
  • 我们喜欢在visual中工作(这就是为什么header.less有一个参考文献)。致variables.less)

谢谢你的反馈。

EN

回答 1

Stack Overflow用户

发布于 2014-04-29 11:42:22

迈克尔!

在多租户环境中使用微软ASP.NET网络优化框架捆绑变压器,因此需要替换System.Web.Optimization的一些组件,并创建自己版本的调试handlers(参见问题:将较少的文件导入添加到BundleResponse.Files集合中讨论)。据我所知,木拉提卡吉尔在SmartStore.NET项目中解决了所有这些问题。

在捆绑变压器中有两种注入较少变量的方法:

  1. 查看较少翻译器的属性GlobalVariablesModifyVariables: 使用System.Collections.Generic;使用System.Web.Optimization;使用BundleTransformer.Core.Builders;使用BundleTransformer.Core.Orderers;使用BundleTransformer.Core.Transformers;使用BundleTransformer.Core.Translators;使用BundleTransformer.Less.Translators;var lessTranslator =新的lessTranslator { GlobalVariables =“my-GlobalVariables=‘Hurrah!’”,ModifyVariables =“字体-家族-基=‘Comic’;body-bg=lime;字体大小-H1=50 bg”};var cssTransformer =新CssTransformer(新列表{ LessTranslator });var commonStylesBundle =新绑定(“~/Bundles/BootstrapStyle”);"~/Content/less/bootstrap-3.1.1/bootstrap.less");commonStylesBundle.Builder = nullBuilder;commonStylesBundle.Transforms.Add(cssTransformer);commonStylesBundle.Orderer = nullOrderer;bundles.Add(commonStylesBundle);}
  2. 创建自定义项转换: 使用System.Text;使用System.Web.Optimization;公共密封类InjectContentItemTransform : IItemTransform {私有只读字符串_beforeContent;私有只读字符串_afterContent;公共InjectContentItemTransform(string beforeContent,string afterContent) { _beforeContent = beforeContent ??string.Empty;_afterContent = afterContent?string.Empty;}公共字符串进程(字符串includedVirtualPath,字符串输入){ if (_beforeContent.Length == 0& _afterContent.Length == 0) {返回输入;} var contentBuilder =新StringBuilder();if (_beforeContent.Length > 0) { contentBuilder.AppendLine(_beforeContent);}contentBuilder.AppendLine(输入);如果(_afterContent.Length > 0) { contentBuilder.AppendLine(_afterContent);}返回contentBuilder.ToString();}}

并将此转换注册如下:

代码语言:javascript
复制
    using System.Web.Optimization;

    using BundleTransformer.Core.Orderers;
    using BundleTransformer.Core.Bundles;

    public class BundleConfig
    {
        public static void RegisterBundles(BundleCollection bundles)
        {
            var nullOrderer = new NullOrderer();

            const string beforeLessCodeToInject = @"@my-variable: 'Hurrah!';";
            const string afterLessCodeToInject = @"@font-family-base: 'Comic Sans MS';
@body-bg: lime;
@font-size-h1: 50px;";

            var commonStylesBundle = new CustomStyleBundle("~/Bundles/BootstrapStyles");
            commonStylesBundle.Include(
               "~/Content/less/bootstrap-3.1.1/bootstrap.less",
               new InjectContentItemTransform(beforeLessCodeToInject, afterLessCodeToInject));
            commonStylesBundle.Orderer = nullOrderer;

            bundles.Add(commonStylesBundle);
        }
    }

这两种方法都有缺点:在调试模式下注入较少的变量不起作用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16945938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档