tac*_*cos 2 css asp.net-mvc less asp.net-web-api2
在我们的多租户应用程序中,我们需要自定义每个租户使用的样式.
我们目前计划在客户端上以下列方式使用LESS和变量:
less.js编译器根据这些变量和步骤1中的固定LESS文件编译LESS这种方法有许多缺点:
less.js我们宁愿在服务器上处理这项工作,所以粗略地说,这发生在服务器上:
GET content/styles/{tenantName}.csstenantName服务器获取配置string.Format或更复杂的东西)Content-Type这是我的问题:
您可以使用BundleTransformer来编译LESS服务器端.
它可能取决于您希望如何提供文件.如果您知道所有租户,那么只需添加每个租户应用程序的捆绑URL到捆绑包配置.
var themeStyles = new CustomStyleBundle("~bundles/theme/tenant").Include("~/Content/theme.less");
themeStyles.Builder = new ThemeBuilder();
BundleTable.Bundles.Add(themeStyles);
Run Code Online (Sandbox Code Playgroud)
如果您没有,并且租户在我们的情况下是灵活的,那么为您的主题添加以下控制器操作.
[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);
}
Run Code Online (Sandbox Code Playgroud)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
您将需要远离获取主题颜色,我们将这些变量存储在HttpContext存储中,以便我们可以使用GetThemeVariables方法中的扩展方法将它们拉出来.
我希望这有帮助.
更新 我扩展了我的原始答案,并创建了一个包含主题的更可重用的方式.
演示网站:http://bundletransformer-theme-builder.azurewebsites.net/
GitHub回复:https://github.com/benembery/bundle-transformer-theme-builder