您可以使用BundleTransformer 来编译您的LESS 服务器端。
这取决于您希望如何提供文件。如果您知道所有租户,那么只需将每个租户应用程序的捆绑 url 添加到捆绑配置中。
var themeStyles = new CustomStyleBundle("~bundles/theme/tenant").Include("~/Content/theme.less");
themeStyles.Builder = new ThemeBuilder();
BundleTable.Bundles.Add(themeStyles);
如果您不这样做并且租户像我们的情况一样灵活,那么为您的主题添加以下控制器操作。
[Route("bundles/theme/{id}")]
public ContentResult Theme(string id)
{
var tenantThemePath = string.Format("~/bundles/theme/{0}", id);
// Check that bundle has not already been added.
if (BundleTable.Bundles.All(x => x.Path != tenantThemePath))
{
var themeStyles = new CustomStyleBundle(tenantThemePath ).Include("~/Content/theme.less");
themeStyles.Builder = new ThemeBuilder();
BundleTable.Bundles.Add(themeStyles);
}
var context = new BundleContext(HttpContext, BundleTable.Bundles, institutionPath);
var response = BundleTable.Bundles.GetBundleFor(tenantThemePath).GenerateBundleResponse(context);
Response.Cache.SetCacheability(response.Cacheability);
return Content(response.Content, response.ContentType);
}
BundleTransformer 的 ThemeBuilder 实现
public class ThemeBuilder : IBundleBuilder
{
public string BuildBundleContent(Bundle bundle, BundleContext context, IEnumerable<BundleFile> files)
{
var lessTranslator = bundle.Transforms.OfType<StyleTransformer>()
.Where(x => x != null)
.Select(x => x.Translators.OfType<LessTranslator>().FirstOrDefault())
.FirstOrDefault();
if (lessTranslator == null)
{
return string.Empty;
}
lessTranslator.GlobalVariables = GetThemeVariables();
return string.Empty;
}
private string GetThemeVariables()
{
// Simplified for brevity
// This will be translated to less variables by the BundleTransformer
// themeColour should correspond to a variable name in your less file.
return string.Format("themeColour={0}", themeColour);
}
}
您将不需要取出主题颜色,我们将这些变量隐藏在 HttpContext 存储中,以便我们可以使用 GetThemeVariables 方法中的扩展方法将它们取出。
我希望这会有所帮助。
更新
我扩展了我的原始答案,并创建了一种包含主题的更可重用的方式。
这里是演示站点:http://bundletransformer-theme-builder.azurewebsites.net/
这里的 GitHub 存储库:https://github.com/benembery/bundle-transformer-theme-builder